Перейти к основному содержимому

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

· 4 мин. чтения

1. Введение

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

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

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

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

2. Настройка Мавена

Для начала нам понадобится зависимость 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 . Мы зафиксируем события журнала и сохраним их в Concurrent HashMap с отметкой времени для ключа.

Вот как мы создаем 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.foreach" status="WARN">

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

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

<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);
}

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

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

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

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

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