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

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

1. Вступление

Большинство библиотек журналов Java сегодня предлагают различные варианты макета для форматирования журналов, чтобы точно соответствовать потребностям каждого проекта.

В этой быстрой статье мы хотим отформатировать и вывести наши записи журнала в формате JSON. Мы увидим, как это сделать для двух наиболее широко используемых библиотек журналов:Log4j2 иLogback.

Оба используютJackson внутри для представления журналов в формате JSON.

Чтобы познакомиться с этими библиотеками, взгляните на нашintroduction to Java Logging article.

2. Log4j2

Log4j2 является прямым преемником самой популярной библиотеки журналирования для Java, Log4J.

Поскольку это новый стандарт для проектов Java, мы покажем, как настроить его для вывода JSON.

2.1. зависимости

Во-первых, мы должны включить следующие зависимости в наш sxml-файлpom.:


    
        org.apache.logging.log4j
        log4j-core
        2.10.0
    

    
        com.fasterxml.jackson.core
        jackson-databind
        2.9.3
    

Последние версии предыдущих зависимостей можно найти на Maven Central:log4j-api,log4j-core,jackson-databind.

2.2. конфигурация

Затем в нашем файлеlog4j2.xml мы можем создать новыйAppender, который используетJsonLayout, и новыйLogger, который использует этотAppender:


    
        
            
        
    



    

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

Установка параметраcompact наfalse увеличит размер вывода, но также сделает его более читабельным.

2.3. Использование Log4j2

В нашем коде мы можем теперь создать наш новый JSON logger и сделать новую трассировку уровня отладки:

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

Logback можно считать еще одним преемником Log4J. Он написан теми же разработчиками и утверждает, что более эффективен и быстрее своего предшественника.

Итак, давайте посмотрим, как настроить его для получения вывода журналов в формате JSON.

3.1. зависимости

Давайте включим в нашpom.xml следующие зависимости:


    
        ch.qos.logback
        logback-classic
        1.1.7
    

    
        ch.qos.logback.contrib
        logback-json-classic
        0.1.5
    

    
        ch.qos.logback.contrib
        logback-jackson
        0.1.5
    

    
        com.fasterxml.jackson.core
        jackson-databind
        2.9.3
    

Здесь мы можем проверить последние версии этих зависимостей:logback-classic,logback-json-classic,logback-jackson,jackson-databind

3.2. конфигурация

Сначала мы создаем новыйappender в нашемlogback.xml, который используетJsonLayout иJacksonJsonFormatter.

После этого мы можем создать новыйlogger, который использует этотappender:


    
        
            true
        
        yyyy-MM-dd' 'HH:mm:ss.SSS
    



    

Как видим, параметрprettyPrint включен для получения удобочитаемого JSON.

3.3. Использование Logback

Давайте создадим экземпляр регистратора в нашем коде и запишем сообщение отладки:

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. Мы делегировали всю сложность синтаксического анализа библиотеке журналов, поэтому нам не нужно изменять какие-либо существующие вызовы журналов.

Как всегда, код для этой статьи доступен на GitHubhere иhere.