1.1 Introdução aos registros

O log é uma lista de eventos que ocorreram. Quase como um jornal ou diário náutico. Bem, portanto, um logger é um objeto com o qual você pode registrar. Na programação, costuma-se registrar quase tudo. E em Java tudo é assim e até um pouco mais.

logger java

O fato é que os programas Java geralmente são grandes aplicativos de servidor sem interface do usuário, console e assim por diante. Eles processam solicitações de milhares de usuários ao mesmo tempo e geralmente ocorrem vários erros. Especialmente quando tópicos diferentes começam a interferir uns nos outros.

E, de fato, a única maneira de encontrar erros e falhas raramente reproduzidos em tal situação é gravar no log / arquivo tudo o que acontece em cada thread.

Na maioria das vezes, as informações são gravadas no log sobre os parâmetros do método com o qual foi chamado, todos os erros interceptados e muitas informações intermediárias. Quanto mais completo o log, mais fácil será restaurar a sequência de eventos e rastrear as causas de uma falha ou erro.

Mas quanto maior o log, mais difícil é trabalhar com ele. Às vezes, os logs atingem vários gigabytes por dia. Isto é bom.

1.2 Registros com falha

Como os primeiros logs, os desenvolvedores usaram simplesmente a saída para o console . É conveniente fazer isso durante a depuração do aplicativo - quando todas as informações importantes e valores de variáveis ​​​​são gravados no console. Mas esse log é completamente inaplicável durante a operação normal do aplicativo.

Em primeiro lugar, o aplicativo pode querer enviar algo para o próprio console e o usuário não deseja ver as informações de serviço destinadas ao programador.

Em segundo lugar, o tamanho do buffer do console é limitado, você não pode escrever muito lá.

E, finalmente, em terceiro lugar, as informações sobre erros do programa coletadas por um longo período de tempo devem ser enviadas aos desenvolvedores do programa. E é mais conveniente gravar todas essas informações de uma vez em um arquivo.

Os desenvolvedores resolveram rapidamente o primeiro problema - eles criaram outro fluxo de saída - System.err. Você pode escrever mensagens nele e elas serão enviadas para um thread separado e não para o console padrão.

E até o problema de gravar em um arquivo foi resolvido:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

Mas mesmo dessa forma, não resolveu todo o problema, então decidiu-se criar uma biblioteca especial que gravaria mensagens de log em um arquivo. Ela fez isso de maneira inteligente e permitiu flexibilidade para configurar filtros para eventos e dados registrados.

Todo o processo de registro, na verdade, consiste em três partes:

  • A primeira parte é a coleta de informações .
  • A segunda parte é a filtragem das informações coletadas.
  • A terceira parte é o registro das informações selecionadas.

1.3 Introdução ao registrador log4j

O primeiro logger popular na comunidade Java foi o log4j. Incluí-lo no projeto é muito simples, para isso você precisa adicionar apenas algumas linhas ao seu pom.xml


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

A interação do seu programa com tal registrador seria algo como isto:

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

Três coisas acontecem aqui:

A criação do objeto é destacada em verde Logger . Seu objeto é armazenado em uma variável estática para um trabalho posterior conveniente com ele. E também getLogger()informações sobre a classe em que as informações são coletadas são passadas para o método.

A linha destacada em azul é onde registramos informações de valor apenas durante a depuração . Para isso, um método especial é usado -debug()

E, finalmente, a linha onde salvamos a exceção que surgiu no log é destacada em vermelho . As exceções são possíveis erros, portanto, o arquivo error().