Introdução ao Java Logging

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:

  1. Adicionando bibliotecas necessárias

  2. Configuração

  3. 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

A versão mais recente delog4j-api você pode encontrarhereelog4j-core -here.

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.