Introdução ao Java Logging
1. Visão geral
O registro é uma ajuda poderosa para compreender e depurar o comportamento em tempo de execução do programa. Os logs capturam e mantêm os dados importantes e os disponibilizam para análise a qualquer momento.
Este artigo discute as estruturas de log java mais populares, Log4j 2 e Logback, junto com seu predecessor Log4j, e aborda brevemente o SLF4J, uma fachada de log que fornece uma interface comum para diferentes estruturas de log.
2. Habilitando registro
Todas as estruturas de log discutidas no artigo compartilham a noção de loggers, anexadores e layouts. A habilitação do log dentro do projeto segue três etapas comuns:
-
Adicionando bibliotecas necessárias
-
Configuração
-
Colocando Instruções de Log
As próximas seções discutem as etapas de cada estrutura individualmente.
3. Log4j 2
O Log4j 2 é uma versão nova e aprimorada da estrutura de log do Log4j. A melhoria mais atraente é a possibilidade de log assíncrono. Log4j 2 requer as seguintes bibliotecas:
org.apache.logging.log4j
log4j-api
2.6.1
org.apache.logging.log4j
log4j-core
2.6.1
3.1. Configuração
A configuração do Log4j 2 é baseada no arquivo de configuração principallog4j.xml. A primeira coisa a configurar é o appender.
Eles determinam para onde a mensagem de log será roteada. O destino pode ser um console, um arquivo, soquete etc.
Log4j 2 tem muitos appenders para diferentes propósitos, você pode encontrar mais informações no site oficialLog4j 2.
Vamos dar uma olhada em um exemplo simples de configuração:
Você pode definir um nome para cada anexador, por exemplo, use o nomeconsole em vez destdout.
Observe o elementoPatternLayout - isso determina como a mensagem deve se parecer. Em nosso exemplo, o padrão é definido com base no parâmetropattern, onde%d determina o padrão de data,%p - saída do nível de log,%m - saída da mensagem registrada e %n - adiciona um novo símbolo de linha. Mais informações sobre o padrão você pode encontrar na página oficialLog4j 2.
Finalmente -to enable an appender (ou múltiplo), você precisa adicioná-lo à seção<Root>:
3.2. Registrando no arquivo
Às vezes, você precisará usar o registro em um arquivo, então adicionaremos o registradorfout à nossa configuração:
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw
O appenderFile tem vários parâmetros que podem ser configurados:
-
file - determina o nome do arquivo de log
-
append - O valor padrão para este parâmetro é verdadeiro, o que significa que, por padrão, um anexadorFile anexará a um arquivo existente e não o truncará.
-
PatternLayout que foi descrito no exemplo anterior.
Para habilitar o appenderFile, você precisa adicioná-lo à seção<Root>:
3.3. Log Assíncrono
Se você deseja tornar seu Log4j 2 assíncrono, você precisa adicionar a biblioteca disruptor LMAX ao seupom.xml. O disruptor LMAX é uma biblioteca de comunicação entre threads sem bloqueio.
Adicionando disruptor ao pom.xml:
com.lmax
disruptor
3.3.4
A última versão do disruptor pode ser encontradahere.
Se você quiser usar o disruptor LMAX, você precisa usar<asyncRoot> em vez de<Root> em sua configuração.
Ou você pode habilitar o log assíncrono configurando a propriedade do sistemaLog4jContextSelector paraorg.apache.logging.log4j.core.async.AsyncLoggerContextSelector.
Claro, você pode ler mais sobre a configuração do logger assíncrono Log4j2 e ver alguns diagramas de desempenho emLog4j2 official page.
3.4. Uso
A seguir, é apresentado um exemplo simples que demonstra o uso do Log4j para o log:
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Log4jExample {
private static Logger logger = LogManager.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
Após a execução, o aplicativo registrará as seguintes mensagens no console e no arquivo denominadoexample.log:
2016-06-16 17:02:13 INFO Info log message
2016-06-16 17:02:13 ERROR Error log message
Se você elevar o nível de log raiz paraERROR:
A saída terá a seguinte aparência:
2016-06-16 17:02:13 ERROR Error log message
Como você pode ver, alterar o nível do log para parâmetro superior faz com que as mensagens com níveis mais baixos de log não sejam impressas nos anexos.
O métodologger.error também pode ser usado para registrar uma exceção que ocorreu:
try {
// Here some exception can be thrown
} catch (Exception e) {
logger.error("Error log message", throwable);
}
3.5. Configuração de Nível de Pacote
Digamos que você precise mostrar mensagens com o nível de registro TRACE - por exemplo, de um pacote específico, comocom.example.log4j2:
logger.trace("Trace log message");
Para todos os outros pacotes, você deseja continuar registrando apenas mensagens INFO.
Lembre-se de que o TRACE é inferior ao INFO no nível do log raiz que especificamos na configuração.
Para habilitar o registro de apenas um dos pacotes, você precisa adicionar a seguinte seção antes de<Root> ao seulog4j.xml:
Isso habilitará o registro para o pacotecom.example.log4j e sua saída será semelhante a:
2016-06-16 17:02:13 TRACE Trace log message
2016-06-16 17:02:13 DEBUG Debug log message
2016-06-16 17:02:13 INFO Info log message
2016-06-16 17:02:13 ERROR Error log message
4. Logback
O Logback é uma versão aprimorada do Log4j, desenvolvida pelo mesmo desenvolvedor que criou o Log4j.
O Logback também possui muito mais recursos em comparação com o Log4j, com muitos deles sendo introduzidos no Log4j 2 também. Aqui está uma rápida olhada em todas as vantagens do Logback noofficial site.
Vamos começar adicionando a seguinte dependência aopom.xml:
ch.qos.logback
logback-classic
1.1.7
Essa dependência atrairá transitivamente outras duas dependências,logback-coreeslf4j-api. Observe que a versão mais recente do Logback pode ser encontradahere.
4.1. Configuração
Vamos agora dar uma olhada em um exemplo de configuração do Logback:
# Console appender
# Pattern of log message for console appender
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
# File appender
example.log
false
# Pattern of log message for file appender
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
# Override log level for specified package
Logback usa SLF4J como uma interface, então você precisa importarLogger eLoggerFactory. de SLF4J
4.2. SLF4J
O SLF4J fornece uma interface e abstração comuns para a maioria das estruturas de log Java. Ele atua como uma fachada e fornece API padronizada para acessar os recursos subjacentes da estrutura de log.
O Logback usa o SLF4J como API nativa para sua funcionalidade. A seguir está o exemplo usando o log de logback:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4jExample {
private static Logger logger = LoggerFactory.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
A saída permanecerá a mesma dos exemplos anteriores.
5. Log4J
Finalmente, vamos dar uma olhada na venerável estrutura de registro Log4j.
Neste ponto, é claro que está desatualizado, mas vale a pena discutir, pois estabelece a base para seus sucessores mais modernos.
Muitos dos detalhes de configuração correspondem aos discutidos na seção Log4j 2.
5.1. Configuração
Em primeiro lugar, você precisa adicionar a biblioteca Log4j aos seus projetospom.xml:
log4j
log4j
1.2.17
Here você deve conseguir encontrar a versão mais recente do Log4j.
Vamos dar uma olhada em um exemplo completo de configuração simples do Log4j com apenas um aplicativo de console:
<log4j:configuration debug=”false”> é uma tag aberta de toda a configuração que possui uma propriedade -debug. Determina se você deseja adicionar informações de depuração do Log4j aos logs.
5.2. Uso
Depois de adicionar a biblioteca e a configuração do Log4j, você pode usar o logger no seu código. Vamos dar uma olhada em um exemplo simples:
import org.apache.log4j.Logger;
public class Log4jExample {
private static Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
6. Conclusão
Este artigo mostra exemplos muito simples de como você pode usar uma estrutura de log diferente, como Log4j, Log4j2 e Logback. Abrange exemplos simples de configuração para todas as estruturas mencionadas.
Os exemplos que acompanham o artigo podem ser encontradosover on GitHub.