Рубрики
Без рубрики

Как создать пользовательский конвертер сообщений для Log4J2

Статья, первоначально размещенная на моем личном веб-сайте в разделе Создание пользовательского конвертера в Log4j2 Я был… Помеченный как java, log4j, log4j2, ведение журнала.

Статья, первоначально размещенная на моем личном веб-сайте в разделе Создание пользовательского конвертера в Log4j2

Я использую Log4J уже много лет. Это мощная библиотека ведения журнала, которая является эффективной и легко настраиваемой. Вы можете с легкостью расширить функциональность и выполнить пользовательские действия с сообщением до его регистрации. Без лишней болтовни, в этой статье я покажу вам, как реализовать пользовательский конвертер для Log4J2.

Что такое конвертер?

Log4J2 имеет несколько компонентов, которые вызываются при регистрации сообщения. У вас есть фактический регистратор, который вы вызываете с необработанным сообщением. Именно здесь происходят вызовы .info или .warn. Регистратор имеет один или несколько добавителей. Эти добавители вызываются с событием журнала и полезны, потому что при желании вы можете зарегистрировать одно и то же сообщение в нескольких местах. Например, у вас может быть приложение для консоли и еще одно для записи в файл. Если вы настроите регистратор на использование обоих добавителей, вам потребуется только один вызов .info(), и он делегирует ведение журнала обоим добавителям.

Далее следует макет. Доступно несколько макетов, и они определяют фактический формат зарегистрированного сообщения. Здесь вы определяете несколько “конвертеров”, и макет будет вызывать каждый из них для форматирования части сообщения и добавления необходимых данных. Существует конвертер для даты, один для исключения, один для сообщения и многое другое. Здесь мы вставим наш код, чтобы мы могли отформатировать зарегистрированное сообщение по-своему.

Как напечатать цветной текст в Log4J2

Для этой статьи мы создадим конвертер, который будет выделять разные слова в зарегистрированном сообщении. Мы сделаем список слов настраиваемым непосредственно из конфигурационного файла log4j. Имейте в виду, что это всего лишь простой пример и что конвертеры можно использовать для гораздо более мощных функций, таких как маскировка чувствительных элементов в журналах или форматирование строк кода определенным образом.

Но, чтобы было проще, мы изменим цвет некоторых слов на голубой. Для этого нам нужен пользовательский конвертер. Это расширит класс LogEventPatternConverter. Кроме того, он должен быть помечен как плагин с помощью аннотации @Plugin (мы также даем ему имя и категорию), и нам нужно определить ключи конвертера. Они будут использоваться в PatternLayout для идентификации нашего конвертера. Когда шаблон проанализирован и наш ключ конвертера идентифицирован, он делегирует событие журнала нашему конвертеру. И да, у вас может быть несколько ключей, если вы хотите.

@Plugin(name = "highlight", category = PatternConverter.CATEGORY)
@ConverterKeys({"color", "colormsg"})
public class HighlightConverter extends LogEventPatternConverter {

}

Теперь нам нужно предоставить конструктор. Конструктор получит список слов, которые мы хотим выделить в журналах. Чтобы убедиться, что у нас нет дубликатов, мы можем сделать это набором. Мы также вызываем super(), чтобы убедиться, что все правильно инициализировано дальше по цепочке. Просматривая документацию для Log4j2, мы узнаем, что преобразователю на самом деле нужен метод new Instance(), и он принимает массив строк в качестве параметра, который представляет параметры для преобразователя. В данном случае опция – это наш список слов, но это может быть все, что нам нужно для правильной инициализации нашего конвертера.

@Plugin(name = "highlight", category = PatternConverter.CATEGORY)
@ConverterKeys({"color", "colormsg"})
public class HighlightConverter extends LogEventPatternConverter {
    private static final String NO_COLOR = "\u001B[0m"; // No color for Windows
    private static final String HIGHLIGHT_COLOR = "\u001B[96m"; // Cyan for Windows

    private Set words;

    private HighlightConverter(Set words) {
        super("HighlightConverter", null);

        this.words = words;
    }

    public static HighlightConverter newInstance(String[] options) {
        return new HighlightConverter(new HashSet<>(Arrays.asList(options)));
    }
}

Теперь, когда мы определили наш конструктор и подготовили набор слов, которые мы хотим выделить, нам нужно изменить сообщение. Все конвертеры Log4j2 должны реализовывать метод append(). Этот метод принимает событие журнала и StringBuilder, к которому должно быть добавлено сообщение. Событие журнала содержит зарегистрированное сообщение, и мы можем извлечь его и заменить наши ключевые слова выделенной версией. Окончательная версия выглядит примерно так:

@Plugin(name = "highlight", category = PatternConverter.CATEGORY)
@ConverterKeys({"color", "colormsg"})
public class HighlightConverter extends LogEventPatternConverter {
    private static final String NO_COLOR = "\u001B[0m";
    private static final String HIGHLIGHT_COLOR = "\u001B[96m";

    private Set words;

    private HighlightConverter(Set words) {
        super("HighlightConverter", null);

        this.words = words;
    }

    public static HighlightConverter newInstance(String[] options) {
        return new HighlightConverter(new HashSet<>(Arrays.asList(options)));
    }



    @Override
    public void format(LogEvent event, StringBuilder toAppendTo) {
        String logMessage = event.getMessage().getFormattedMessage();
        for (String word:words) {
            logMessage = logMessage.replaceAll(word, HIGHLIGHT_COLOR + word + NO_COLOR);
        }

        toAppendTo.append(logMessage);
    }
}

Использование пользовательского конвертера в Log4J2

Мы подготовили наш конвертер, но как нам сказать Log4j2 использовать его? Нам нужны две вещи. Во-первых, нам нужно сообщить Log4J, чтобы он включил наш класс конвертера. Это делается путем добавления пакета, в котором находится конвертер, в нашу конфигурацию:





Далее мы определяем наше приложение (в данном случае Консольное приложение), которое имеет макет шаблона. Для сообщения вместо использования %m (стандартный ключ конвертера для зарегистрированного сообщения) мы используем наш определенный ключ конвертера: %color или %colormsg. Простое добавление этого не принесет никакой пользы, так как мы не указали, какие слова выделять. Нам нужно добавить параметры в конвертер. Это делается с помощью синтаксиса {param}, и у нас может быть столько, сколько нам нужно. Вот пример конфигурации, в которой выделяются слова “пользовательский”, “выделить” и “слова”.:



    
        
            
        
    
    
        
            
        
    

Выводы

Легко определить пользовательский конвертер сообщений, который удовлетворит любые потребности ведения журнала. Использовать его для выделения слов легко, но сам конвертер может быть намного сложнее и выполнять более сложные задачи, такие как маскировка, форматирование кода или что-то еще, что вы можете придумать. Аналогичный подход также можно использовать для создания пользовательского приложения или пользовательского макета.

Полный источник и оригинальная статья на моем личном сайте по адресу Создание пользовательского конвертера в Log4j2

Оригинал: “https://dev.to/pazvanti/how-to-make-a-custom-message-converter-for-log4j2-p0p”