1. Введение
Сегодня большинство библиотек ведения журналов Java предлагают различные варианты форматирования журналов, чтобы точно соответствовать потребностям каждого проекта.
В этой быстрой статье мы хотим отформатировать и вывести наши записи журнала в формате JSON. Мы увидим, как это сделать для двух наиболее широко используемых библиотек журналирования: Log4j2
и Logback
.
Оба используют Джексон
для внутреннего представления журналов в формате JSON.
Для ознакомления с этими библиотеками взгляните на нашу статью «Введение в Java Logging» .
2. Лог4j2
Log4j2 является прямым преемником самой популярной библиотеки журналирования для Java, Log4J.
Поскольку это новый стандарт для проектов Java, мы покажем, как настроить его для вывода JSON.
2.1. Зависимости
Во-первых, мы должны включить следующие зависимости в наш файл pom.
XML-файл:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
</dependencies>
Последние версии предыдущих зависимостей можно найти на Maven Central: log4j-api , log4j-core , jackson-databind.
2.2. Конфигурация
Затем в нашем файле log4j2.
xml мы можем создать новый Appender
, который использует JsonLayout
, и новый Logger
, который использует этот Appender
:
<Appenders>
<Console name="ConsoleJSONAppender" target="SYSTEM_OUT">
<JsonLayout complete="false" compact="false">
<KeyValuePair key="myCustomField" value="myCustomValue" />
</JsonLayout>
</Console>
</Appenders>
<Logger name="CONSOLE_JSON_APPENDER" level="TRACE" additivity="false">
<AppenderRef ref="ConsoleJSONAppender" />
</Logger>
Как видно из примера конфигурации, можно добавлять собственные значения в журнал с помощью KeyValuePair
, который даже поддерживает поиск в контексте журнала.
Установка для параметра compact значения
false
увеличит размер вывода, но сделает его более удобочитаемым для человека.
2.3. Использование Log4j2
Теперь в нашем коде мы можем создать новый регистратор JSON и создать новую трассировку уровня отладки:
Logger logger = LogManager.getLogger("CONSOLE_JSON_APPENDER");
logger.debug("Debug message");
Выходное сообщение отладки для предыдущего кода будет таким:
{
"timeMillis" : 1513290111664,
"thread" : "main",
"level" : "DEBUG",
"loggerName" : "CONSOLE_JSON_APPENDER",
"message" : "My debug message",
"endOfBatch" : false,
"loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
"threadId" : 1,
"threadPriority" : 5,
"myCustomField" : "myCustomValue"
}
3. Логбэк
Logback можно считать еще одним преемником Log4J. Он написан теми же разработчиками и претендует на то, чтобы быть более эффективным и быстрым, чем его предшественник.
Итак, давайте посмотрим, как настроить его для получения логов в формате JSON.
3.1. Зависимости
Давайте включим следующие зависимости в наш pom.xml
:
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-json-classic</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback.contrib</groupId>
<artifactId>logback-jackson</artifactId>
<version>0.1.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
</dependencies>
Мы можем проверить здесь последние версии этих зависимостей: logback-classic , logback-json-classic , logback-jackson , jackson -databind .
3.2. Конфигурация
Во-первых, мы создаем в нашем logback.xml новое
добавление
, которое использует JsonLayout
и JacksonJsonFormatter.
После этого мы можем создать новый логгер
, который использует этот appender
:
<appender name="json" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<jsonFormatter
class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
<timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
</layout>
</appender>
<logger name="jsonLogger" level="TRACE">
<appender-ref ref="json" />
</logger>
Как мы видим, параметр prettyPrint
включен для получения удобочитаемого JSON.
3.3. Использование журнала
Давайте создадим регистратор в нашем коде и запишем отладочное сообщение:
Logger logger = LoggerFactory.getLogger("jsonLogger");
logger.debug("Debug message");
При этом – мы получим следующий вывод:
{
"timestamp" : "2017-12-14 23:36:22.305",
"level" : "DEBUG",
"thread" : "main",
"logger" : "jsonLogger",
"message" : "Debug log message",
"context" : "default"
}
4. Вывод
Мы видели здесь, как мы можем легко настроить Log4j2, а Logback иметь выходной формат JSON. Мы делегировали всю сложность синтаксического анализа библиотеке протоколирования, поэтому нам не нужно изменять какие-либо существующие вызовы регистратора.
Как всегда, код этой статьи доступен на GitHub здесь и здесь .