«1. Введение

В этом руководстве мы узнаем о создании пользовательского приложения Log4j2. Если вы ищете введение в Log4j2, ознакомьтесь с этой статьей.

Log4j2 поставляется с множеством встроенных приложений, которые можно использовать для различных целей, таких как запись в файл, в базу данных, в сокет или в базу данных NoSQL.

Однако в зависимости от требований приложения может возникнуть потребность в пользовательском приложении.

Log4j2 — это обновленная версия Log4j со значительными улучшениями по сравнению с Log4j. Следовательно, мы будем использовать структуру Log4j2, чтобы продемонстрировать создание пользовательского приложения.

2. Настройка Maven

Для начала нам понадобится зависимость log4j-core в нашем pom.xml:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.0</version>
</dependency>

Последнюю версию log4j-core можно найти здесь.

3. Пользовательское добавление

Есть два способа реализации нашего пользовательского добавления. Во-первых, реализуя интерфейс Appender, а во-вторых, расширяя класс AbstractAppender. Второй метод обеспечивает простой способ реализации нашего собственного пользовательского приложения, и именно его мы будем использовать.

В этом примере мы создадим MapAppender. Мы зафиксируем события журнала и сохраним их в ConcurrentHashMap с отметкой времени для ключа.

Вот как мы создаем MapAppender:

@Plugin(
  name = "MapAppender", 
  category = Core.CATEGORY_NAME, 
  elementType = Appender.ELEMENT_TYPE)
public class MapAppender extends AbstractAppender {

    private ConcurrentMap<String, LogEvent> eventMap = new ConcurrentHashMap<>();

    protected MapAppender(String name, Filter filter) {
        super(name, filter, null);
    }

    @PluginFactory
    public static MapAppender createAppender(
      @PluginAttribute("name") String name, 
      @PluginElement("Filter") Filter filter) {
        return new MapAppender(name, filter);
    }

    @Override
    public void append(LogEvent event) {
        eventMap.put(Instant.now().toString(), event);
    }
}

Мы добавили к классу аннотацию @Plugin, которая указывает, что наш Appender является подключаемым модулем.

Имя плагина означает имя, которое мы должны указать в конфигурации для использования этого приложения. Категория указывает ту категорию, в которую мы помещаем плагин. Тип элемента — это appender.

Нам также нужен фабричный метод, который создаст приложение. Наш метод createAppender служит этой цели и снабжен аннотацией @PluginFactory.

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

Далее мы переопределили метод append, который имеет фактическую логику обработки LogEvent. В нашем случае метод append помещает LogEvent в нашу карту событий.

4. Конфигурация

Теперь, когда у нас есть MapAppender, нам нужен файл конфигурации lo4j2.xml для использования этого приложения для ведения журнала.

Вот как мы определяем раздел конфигурации в нашем файле log4j2.xml:

<Configuration xmlns:xi="http://www.w3.org/2001/XInclude" packages="com.baeldung" status="WARN">

Обратите внимание, что атрибут packages должен ссылаться на пакет, содержащий ваш пользовательский файл appender.

Далее, в разделе нашего приложения, мы определяем приложение. Вот как мы добавляем наш пользовательский аппендер в список аппендеров в конфигурации:

<MapAppender name="MapAppender" />

Последняя часть — это фактическое использование аппендера в нашем разделе Loggers. Для нашей реализации мы используем MapAppender в качестве корневого регистратора и определяем его в корневом разделе.

Вот как это делается:

<Root level="DEBUG">
    <AppenderRef ref="MapAppender" />
</Root>

5. Обработка ошибок

Для обработки ошибок при регистрации события мы можем использовать метод ошибки, унаследованный от AbstractAppender.

Например, если мы не хотим логировать события, уровень логирования которых меньше уровня WARN.

Мы можем использовать метод error класса AbstractAppender для регистрации сообщения об ошибке. Вот как это делается в нашем классе:

public void append(LogEvent event) {
    if (event.getLevel().isLessSpecificThan(Level.WARN)) {
        error("Unable to log less than WARN level.");
        return;
    }
    eventMap.put(Instant.now().toString(), event);
}

Посмотрите, как теперь изменился наш метод добавления. Мы проверяем уровень события на предмет того, что он выше WARN, и возвращаемся раньше, если он ниже WARN.

6. Заключение

В этой статье мы рассмотрели, как реализовать собственный аппендер для Log4j2.

Несмотря на то, что существует множество встроенных способов регистрации наших данных с помощью предоставленных приложений Log4j2, у нас также есть инструменты в этой структуре, которые позволяют нам создавать собственные приложения в соответствии с потребностями нашего приложения.

Как обычно, пример можно найти на Github.