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.