JavaRush /Blogue Java /Random-PT /Por que o registro é necessário?

Por que o registro é necessário?

Publicado no grupo Random-PT
Olá! Ao escrever palestras, observo especialmente se um determinado tópico será definitivamente usado em um trabalho real. Por que você precisa de registro - 1 Então, ATENÇÃO! O tema que abordaremos hoje certamente será útil para você em todos os seus projetos desde o primeiro dia de trabalho. Falaremos sobre registro. Este tema não é nada difícil (diria até fácil). Mas no seu primeiro emprego já haverá estresse suficiente para ainda lidar com as coisas óbvias, então é melhor resolver isso agora :) Então, vamos começar. O que é registro? Logging é registrar em algum lugar dados sobre a operação de um programa. O local onde esses dados são gravados é chamado de “ log ”. Duas questões surgem ao mesmo tempo: onde e quais dados são registrados? Vamos começar com "onde". Você pode registrar dados de operação do programa em muitos locais diferentes. Por exemplo, durante seus estudos, você costuma enviar dados para o console usando System.out.println(). Este é um registro real, embora o mais simples. Claro, isso não é muito conveniente para o cliente ou a equipe de suporte ao produto: eles obviamente não vão querer instalar o IDE e monitorar o console :) Também existe um formato mais familiar para registrar informações - em um arquivo de texto. É muito mais fácil para as pessoas lê-los desta forma e certamente muito mais fácil de armazenar! Agora a segunda pergunta: quais dados sobre o funcionamento do programa devem ser registrados no log? Mas aqui tudo depende de você! O sistema de log Java é muito flexível. Você pode configurá-lo de forma que todo o andamento do seu programa seja registrado. Por um lado, isso é bom. Mas por outro lado, imagine qual o tamanho que os logs do Facebook ou Twitter podem atingir se tudo estiver escrito lá. Essas grandes empresas provavelmente têm a capacidade de armazenar até mesmo essa quantidade de informações. Mas imagine quão difícil será procurar informações sobre um erro crítico em logs de 500 gigabytes de texto? É ainda pior do que uma agulha num palheiro. Portanto, o log em Java pode ser configurado para que apenas dados de erro sejam gravados no log (log). Ou mesmo apenas sobre erros críticos! Embora dizer “fazer login em Java” não seja totalmente correto. O fato é que a necessidade de log surgiu entre os programadores antes que essa funcionalidade fosse adicionada à linguagem. E quando o Java teve sua própria biblioteca de log, todo mundo já estava usando a biblioteca log4j. A história do surgimento do log em Java é na verdade muito longa e informativa, quando você quiser, você pode ler este post no Habré . Resumindo, Java tem sua própria biblioteca de log, mas quase ninguém a usa :) Mais tarde, quando várias bibliotecas de log diferentes apareceram e todos os programadores começaram a usar outras diferentes, surgiu um problema de compatibilidade. Para evitar que as pessoas façam a mesma coisa usando uma dúzia de bibliotecas diferentes com interfaces diferentes, foi criada a estrutura de abstração slf4j(“Fachada de registro de serviço para Java”). É chamado de abstração porque embora você use classes slf4j e chame seus métodos, nos bastidores eles têm todas as estruturas de log anteriores em execução: log4j, java.util.logging padrão e outros. Se você atualmente precisa de algum recurso específico do log4j que outras bibliotecas não possuem, mas não gostaria de vincular estritamente o projeto a esta biblioteca específica, basta usar slf4j. E ela já vai “puxar” os métodos log4j. Se você mudar de ideia e decidir que não precisa mais dos recursos do log4j, basta reconfigurar o “wrapper” (ou seja, slf4j) para usar outra biblioteca. Seu código não vai parar de funcionar, pois nele você chama métodos do slf4j, e não de uma biblioteca específica. Uma pequena digressão. Para que os exemplos a seguir funcionem, você precisa baixar a biblioteca slf4j aqui e a biblioteca log4j aqui . Em seguida, precisamos descompactar o arquivo e adicionar os arquivos jar necessários ao caminho de classe por meio do Intellij IDEA. Itens de menu: Arquivo -> Estrutura do Projeto -> Bibliotecas Selecione os jars necessários e adicione-os ao projeto (há muitos jars nos arquivos que baixamos, veja os que você precisa nas fotos) Por que você precisa de registro - 2Por que você precisa de registro - 3Nota - esta instrução é para aqueles alunos que não sabem usar o Maven. Se você sabe como usá-lo, é melhor tentar começar por ele: geralmente é muito mais fácil. Se você usa Maven , adicione esta dependência:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Ótimo, resolvemos as configurações :) Vejamos como o slf4j funciona. Como podemos ter certeza de que o progresso do programa será registrado em algum lugar? Para isso precisamos de duas coisas - um logger e um appender . Vamos começar com o primeiro. Um logger é um objeto que gerencia completamente a manutenção de registros . Criar um logger é muito fácil: é feito usando um método estático - LoggerFactory.getLogger(). Como parâmetro do método, você precisa passar uma classe cujo trabalho será registrado. Vamos executar nosso código:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Saída do console: ERROR StatusLogger Nenhum arquivo de configuração Log4j 2 encontrado. Usando configuração padrão (registrando apenas erros no console) ou configurações fornecidas programaticamente pelo usuário. Defina a propriedade do sistema 'log4j2.debug' para mostrar o log de inicialização interna do Log4j 2. Consulte https://logging.apache.org/log4j/2.x/manual/configuration.html para obter instruções sobre como configurar o Log4j 2 15:49:08.907 [main] ERROR MyTestClass - Ocorreu um erro no programa! O que vemos aqui? Primeiro vemos uma mensagem de erro. Apareceu porque atualmente não temos as configurações necessárias. Portanto, nosso logger agora só pode gerar mensagens de erro (ERROR) e apenas para o console. O método logger.info()não foi executado. Mas logger.error()funcionou! O console exibe a data atual, o método onde ocorreu o erro ( main), a palavra ERRO e nossa mensagem! ERRO é o nível de registro. Em geral, se uma entrada de log estiver marcada com a palavra ERRO, significa que ocorreu um erro naquele ponto do programa. Se uma entrada estiver marcada com a palavra INFO, significa que se trata simplesmente de informações atuais sobre o funcionamento normal do programa. A biblioteca SLF4J possui vários níveis de log diferentes que permitem configurar o log de maneira flexível. Eles são muito fáceis de gerenciar: toda a lógica necessária já está incluída na classe Logger. Você só precisa chamar os métodos necessários. Se você quiser postar uma mensagem normal, ligue para logger.info(). Mensagem de erro - logger.error(). Exibir um aviso - logger.warn() Agora vamos falar sobre o anexador . O anexador é o local de onde vêm seus dados. Você poderia dizer que o oposto de uma fonte de dados é o “ponto B”. Por padrão, os dados são enviados para o console. Observe que no exemplo anterior não tivemos que configurar nada: o texto apareceu no próprio console, mas o logger da biblioteca log4j só pode enviar mensagens de nível de ERRO para o console. Obviamente, é mais conveniente para as pessoas lerem os logs de um arquivo de texto e armazenarem os logs nos mesmos arquivos. Para alterar o comportamento padrão do logger, precisamos configurar nosso appender de arquivo . Para começar, você precisa criar um arquivo log4j.xml diretamente na pasta src , ou na pasta de recursos, se você usar o Maven, ou na pasta de recursos, caso você use o Maven. Você já conhece o formato xml, recentemente tivemos uma palestra sobre ele :) Este será o seu conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Não parece particularmente complicado :) Mas vamos analisar o conteúdo.
<Configuration status="INFO">
Este é o chamado registrador de status. Não está relacionado ao nosso logger e é usado internamente pelo log4j. Você pode definir status=”TRACE” em vez de status=”INFO”, e todas as informações sobre o funcionamento interno do log4j serão enviadas para o console (o status-logger envia dados para o console, mesmo que nosso anexador para o programa seja um arquivo -baseado). Não precisamos disso agora, então deixaremos tudo como está.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Aqui criamos nosso appender. A tag <File>indica que será um arquivo. name="MyFileAppender"- o nome do nosso anexador. fileName="C:\Users\Username\Desktop\testlog.txt"— caminho para o arquivo de log onde todos os dados serão gravados. append="true"— se é necessário gravar dados adicionais no final do arquivo. No nosso caso será assim. Se definido como false , o conteúdo do log antigo será excluído sempre que o programa for reiniciado. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Estas são configurações de formatação. Aqui podemos usar expressões regulares para personalizar o formato do texto em nosso log.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Aqui especificamos o nível de log (nível raiz). Temos o nível INFO definido: ou seja, todas as mensagens em níveis superiores a INFO (de acordo com a tabela que vimos acima) não serão incluídas no log. Teremos 3 mensagens em nosso programa: uma INFO, uma WARN e uma ERROR. Com a configuração atual, todas as 3 mensagens serão gravadas no log. Se você alterar o nível raiz para ERROR, apenas a última mensagem de LOGGER.error() será registrada. Além disso, um link para o anexo é colocado aqui. Para criar esse link, você precisa <Root>criar uma tag dentro da tag <ApprenderRef>e adicionar um parâmetro a ela ref=”Name твоего аппендера”. Criamos aqui o nome do appender, caso você tenha esquecido: <File name="MyFileAppender" E aqui está o código do nosso programa!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Claro, é um pouco torto (capturar RuntimeException é uma ideia medíocre), mas é perfeito para nossos propósitos :) Vamos executar nosso método main()4 vezes seguidas e dar uma olhada em nosso arquivo testlog.txt. Não há necessidade de criá-lo com antecedência: a biblioteca fará isso automaticamente. Tudo funcionou! :) Agora você tem um logger configurado. Você pode brincar com alguns programas que escreveu anteriormente, adicionando chamadas de logger a todos os métodos e observar o log resultante :) Para leitura adicional, recomendo fortemente este artigo . Lá, o tema da exploração madeireira é discutido em profundidade e não será fácil lê-lo de uma só vez. Mas contém muitas informações adicionais úteis. Por exemplo, você aprenderá como configurar um logger para que ele crie um novo arquivo de texto se nosso arquivo testlog.txt atingir um determinado tamanho :) E este é o fim da nossa lição! Hoje você aprendeu sobre um tema muito importante e esse conhecimento com certeza será útil para você em seus trabalhos futuros. Ver você de novo! :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION