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

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

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

1. Введение

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

Logback поставляется со многими встроенными приложениями, которые записывают в стандартный вывод, файловую систему или базу данных. Красота архитектуры этого фреймворка заключается в его модульности, что означает, что мы можем легко настроить его.

В этом руководстве мы сосредоточимся на logback-classic , для которого требуется следующая зависимость Maven:

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>

Последняя версия этой зависимости доступна на Maven Central .

2. Базовые приложения Logback

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

Appender — это универсальный интерфейс, который должны реализовать все приложения. Общий тип — ILoggingEvent или AccessEvent , в зависимости от того, используем ли мы logback-classic или logback-access соответственно.

Наш пользовательский аппендер должен расширять либо AppenderBase , либо UnsynchronizedAppenderBase , которые реализуют Appender и обрабатывают такие функции, как фильтры и сообщения о состоянии.

AppenderBase является потокобезопасным; Подклассы UnsynchronizedAppenderBase отвечают за управление потокобезопасностью.

Точно так же, как ConsoleAppender и FileAppender расширяют OutputStreamAppender и вызывают суперметод setOutputStream() , пользовательское приложение должно быть подклассом OutputStreamAppender , если оно записывает в OutputStream .

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

Для нашего пользовательского примера мы создадим игрушечное приложение с именем MapAppender . Это приложение будет вставлять все события регистрации в Concurrent HashMap с отметкой времени для ключа. Для начала мы создадим подкласс AppenderBase и будем использовать ILoggingEvent в качестве универсального типа:

public class MapAppender extends AppenderBase<ILoggingEvent> {

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

@Override
protected void append(ILoggingEvent event) {
eventMap.put(System.currentTimeMillis(), event);
}

public Map<String, ILoggingEvent> getEventMap() {
return eventMap;
}
}

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

<configuration>
<appender name="map" class="com.foreach.logback.MapAppender"/>
<root level="info">
<appender-ref ref="map"/>
</root>
</configuration>

4. Настройка свойств

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

Давайте добавим в MapAppender свойство, которое дает eventMap префикс для его ключа:

public class MapAppender extends AppenderBase<ILoggingEvent> {

//...

private String prefix;

@Override
protected void append(ILoggingEvent event) {
eventMap.put(prefix + System.currentTimeMillis(), event);
}

public String getPrefix() {
return prefix;
}

public void setPrefix(String prefix) {
this.prefix = prefix;
}

//...

}

Затем добавьте свойство в нашу конфигурацию, чтобы установить этот префикс:

<configuration debug="true">

<appender name="map" class="com.foreach.logback.MapAppender">
<prefix>test</prefix>
</appender>

//...

</configuration>

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

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

Например, когда свойство prefix имеет значение null или пустую строку, MapAppender может вызвать addError() и вернуться раньше:

public class MapAppender extends AppenderBase<ILoggingEvent> {

//...

@Override
protected void append(final ILoggingEvent event) {
if (prefix == null || "".equals(prefix)) {
addError("Prefix is not set for MapAppender.");
return;
}

eventMap.put(prefix + System.currentTimeMillis(), event);
}

//...

}

Когда в нашей конфигурации включен флаг отладки, мы увидим ошибку в консоли, которая предупреждает нас о том, что свойство префикса не установлено:

<configuration debug="true">

//...

</configuration>

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

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

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