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 .