Obter saída de log em JSON

Obter saída de log em JSON

1. Introdução

Atualmente, a maioria das bibliotecas de log Java oferece diferentes opções de layout para formatação de logs - para atender com precisão às necessidades de cada projeto.

Neste artigo rápido, queremos formatar e gerar nossas entradas de log como JSON. Veremos como fazer isso para as duas bibliotecas de registro mais amplamente usadas:Log4j2eLogback.

Ambos usamJackson internamente para representar logs no formato JSON.

Para uma introdução a essas bibliotecas, dê uma olhada em nossointroduction to Java Logging article.

2. Log4j2

Log4j2 é o sucessor direto da biblioteca de registro mais popular para Java, Log4J.

Como é o novo padrão para projetos Java, mostraremos como configurá-lo para gerar JSON.

2.1. Dependências

Primeiro, temos que incluir as seguintes dependências em nosso arquivopom.xml:


    
        org.apache.logging.log4j
        log4j-core
        2.10.0
    

    
        com.fasterxml.jackson.core
        jackson-databind
        2.9.3
    

As versões mais recentes das dependências anteriores podem ser encontradas no Maven Central:log4j-api,log4j-core,jackson-databind.

2.2. Configuração

Então, em nosso arquivolog4j2.xml, podemos criar um novoAppender que usaJsonLayoute um novoLogger que usa esteAppender:


    
        
            
        
    



    

Como podemos ver no exemplo de configuração, é possível adicionar nossos próprios valores ao log usandoKeyValuePair, que até suporta lookout no contexto do log.

Definir o parâmetrocompact comofalse aumentará o tamanho da saída, mas também a tornará mais legível.

2.3. Usando Log4j2

Em nosso código, agora podemos instanciar nosso novo criador de logs JSON e fazer um novo rastreamento no nível de depuração:

Logger logger = LogManager.getLogger("CONSOLE_JSON_APPENDER");
logger.debug("Debug message");

A mensagem de saída de depuração para o código anterior seria:

{
  "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 pode ser considerado outro sucessor do Log4J. Foi escrito pelos mesmos desenvolvedores e afirma ser mais eficiente e rápido do que seu antecessor.

Então, vamos ver como configurá-lo para obter a saída dos logs no formato JSON.

3.1. Dependências

Vamos incluir as seguintes dependências em nossopom.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
    

Podemos verificar aqui as versões mais recentes dessas dependências:logback-classic,logback-json-classic,logback-jackson,jackson-databind

3.2. Configuração

Primeiro, criamos um novoappender em nossologback.xml que usaJsonLayouteJacksonJsonFormatter.

Depois disso, podemos criar um novologger que usa esteappender:


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



    

Como vemos, o parâmetroprettyPrint é habilitado para obter um JSON legível por humanos.

3.3. Usando Logback

Vamos instanciar o logger em nosso código e registrar uma mensagem de depuração:

Logger logger = LoggerFactory.getLogger("jsonLogger");
logger.debug("Debug message");

Com isso, obteremos a seguinte saída:

{
  "timestamp" : "2017-12-14 23:36:22.305",
  "level" : "DEBUG",
  "thread" : "main",
  "logger" : "jsonLogger",
  "message" : "Debug log message",
  "context" : "default"
}

4. Conclusão

Vimos aqui como podemos configurar facilmente Log4j2 e Logback para um formato de saída JSON. Delegamos toda a complexidade da análise para a biblioteca de registro, portanto, não precisamos alterar nenhuma chamada existente do logger.

Como sempre, o código deste artigo está disponível no GitHubhereehere.