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

Получить вывод журнала в формате JSON

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

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 здесь и здесь .