Создание пользовательского приложения Log4j2

Создание пользовательского приложения Log4j2

1. Вступление

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

Log4j2 ships with a lot of built-in appenders, который можно использовать для различных целей, таких как запись в файл, в базу данных, в сокет или в базу данных NoSQL.

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

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

2. Maven Setup

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


    org.apache.logging.log4j
    log4j-core
    2.11.0

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

3. Пользовательский Appender

Есть два способа, которыми мы можем реализовать наш пользовательский аппендер. First is by implementing the Appender interface and the second is by extending the AbstractAppender class. Второй метод обеспечивает простой способ реализации нашего собственного настраиваемого приложения, и мы будем его использовать.

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

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

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

    private ConcurrentMap 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 , которая указывает, что наше приложение является плагином.

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

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

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

Далееwe’ve overridden the append method which has the actual logic of handling the LogEvent. В нашем случае методappend помещаетLogEvent в нашeventMap. 

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

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

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

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

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

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

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


    

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

Для обработки ошибок при регистрации события мы можем использовать методerror, унаследованный от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);
}

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

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

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

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

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