System.out.println vs Loggers

System.out.println vs Loggers

1. Por que madeireiros?

Ao escrever um programa ou desenvolver um aplicativo de produção empresarial, usarSystem.out.println parece ser a opção mais simples e fácil. Não há bibliotecas extras a serem adicionadas ao caminho de classe e nenhuma configuração adicional a ser feita.

Mas usarSystem.out.println tem várias desvantagens que afetam sua usabilidade em muitas situações. Neste tutorial, discutiremoswhy and when we’d want to use a Logger over plain old System.out and System.err. Também mostraremos alguns exemplos rápidos usando a estrutura de registro Log4J2.

2. Configuração

Antes de começar, vamos dar uma olhada nas dependências e configurações necessárias do Maven.

2.1. Dependências do Maven

Vamos começar adicionando a dependência Log4J2 ao nossopom.xml:


    org.apache.logging.log4j
    log4j-api
    2.12.1


    org.apache.logging.log4j
    log4j-core
    2.12.1

Podemos encontrar as versões mais recentes delog4j-apielog4j-core no Maven Central.

2.2. Configuração Log4J2

O uso deSystem.out não requer nenhuma configuração adicional. No entanto, para usar o Log4J2, precisamos de um arquivo de configuraçãolog4j.xml:


    
        
            
        
    
    
        
    

Quase todas as estruturas de logger exigirão algum nível de configuração, sejaprogrammatically ou por meio de um arquivo de configuração externo, como o arquivo XML mostrado aqui.

3. Saída de log de separação

3.1. System.out eSystem.err

Quando implantamos nosso aplicativo em um servidor como o Tomcat, o servidor usa seu próprio criador de logs. Se usarmosSystem.out, os logs terminam emcatalina.out. É muito mais fácil depurar nosso aplicativo se os registros forem colocados em um arquivo separado. Com o Log4j2, precisamos incluir um aplicativo de arquivo na configuração para salvar os logs do aplicativo em um arquivo separado.

Além disso, comSystem.out.println, não há controle ou filtragem de quais logs devem ser impressos. A única maneira possível de separar os logs é usarSystem.out.println  para logs de informações eSystem.err.println  para logs de erros:

System.out.println("This is an informational message");
System.err.println("This is an error message");

3.2. Níveis de Log4J2

Em ambientes de depuração ou desenvolvimento, queremos ver todas as informações que o aplicativo está imprimindo. Porém, em um aplicativo corporativo ativo, mais logs significam um aumento na latência. Logger frameworks like Log4J2 provide multiple log level controls:

  • FATAL

  • ERRO

  • WARN

  • INFO

  • DEPURAR

  • VESTÍGIO

  • ALL

Usando esses níveis,we can easily filter when and where to print what information:

logger.trace("Trace log message");
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
logger.warn("Warn log message");
logger.fatal("Fatal log message");

Também podemos configurar os níveis para cada pacote de código-fonte individualmente. Para obter mais detalhes sobre a configuração do nível de log, consulte nossoJava Logging article.

4. Gravando logs em arquivos

4.1. ReencaminhandoSystem.out eSystem.err

É possível rotearSystem.out.println para um arquivo usando o métodoSystem.setOut():

PrintStream outStream = new PrintStream(new File("outFile.txt"));
System.setOut(outStream);
System.out.println("This is a example article");

E no caso deSystem.err:

PrintStream errStream = new PrintStream(new File("errFile.txt"));
System.setErr(errStream);
System.err.println("This is a example article error");

When redirecting the output to a file using System.out or System.err, we can’t control the file size, portanto, o arquivo continua crescendo durante a execução do aplicativo.

Conforme o tamanho do arquivo aumenta, pode ser difícil abrir ou analisar esses logs maiores.

4.2. Registrando em arquivos com Log4J2

O Log4J2 fornece um mecanismo para gravar sistematicamente os logs nos arquivos e também rolar os arquivos com base em determinadas políticas. Por exemplo, podemosconfigure the files to be rolled over based on a date/time pattern:



    
        
            
        
    
        
            
            
        
    

Ou podemosroll the files based on size once they reach a given threshold:

...

    
        %d{yyyy-MM-dd HH:mm:ss} %p %m%n
    
    
        
        
    

5. Registrando em sistemas externos

Como vimos na seção anterior, as estruturas de registro permitem gravar os registros em um arquivo. Da mesma forma, eles também fornecemappenders to send logs to other systems and applications. Isso torna possível enviar logs para um Kafka Stream ou um banco de dados Elasticsearch usando anexadores Log4J em vez de usarSystem.out.println.

Consulte nossoLog4j appender article para obter mais detalhes sobre como usar esses appenders.

6. Personalizando a saída do log

Com o uso de registradores, podemos personalizar quais informações devem ser impressas junto com a mensagem real. As informações que podemos imprimir incluem o nome do pacote, o nível do log, o número da linha, o carimbo de data e hora, o nome do método etc.

Embora isso seja possível comSystem.out.println,, exigiria muito trabalho manual, enquanto as estruturas de registro fornecem essa funcionalidade pronta para uso. Com registradores,we can simply define a pattern in the logger configuration:


    

Se considerarmos o Log4J2 para nossa estrutura de criadores de logs, existem vários padrões que podemos escolher ou personalizar. Consulteofficial Log4J2 documentation para aprender mais sobre eles.

7. Conclusão

Este artigo explica vários motivos pelos quais usar uma estrutura de logger e por que não confiar apenas emSystem.out.println para os logs de nossos aplicativos. Embora seja justificável usarSystem.out.println para pequenos programas de teste, preferimos não usá-lo como nossa principal fonte de registro para um aplicativo de produção empresarial.

Como sempre, os exemplos de código no artigo estão disponíveisover on GitHub.