Java: recolher logs de várias linhas em um log de linha única usando Spring e Logback ou Log4j2

Logback e Log4j2 são algumas das estruturas de log JAVA mais famosas. A estrutura Logback é usada apenas em conjunto com a biblioteca SLF4J, que é uma interface para sistemas de log de eventos. O Log4j2 é a segunda versão aprimorada do log4, uma biblioteca de log na qual a API e a implementação são separadas, o que permite usar a API do Log4j 2 em conjunto com a implementação de outro logger.

O Spring Music é um aplicativo para usar o serviço de banco de dados do ambiente Cloud Foundry em conjunto com o Spring Framework e o Spring Boot. Foi criado para armazenar os mesmos objetos de domínio em um dos muitos repositórios diferentes - relacionais a objetos, orientados a documentos ou distribuídos (armazenamento de valores-chave).



Os dois registradores mais comuns usados ​​com o Spring / Spring Boot são Logback e Log4j2. Até recentemente, o desenvolvedor tinha mais liberdade de ação em relação ao formato dos logs e dos próprios arquivos usados ​​para o log. No entanto, no mundo moderno da implementação e dimensionamento de contêineres, o registro geralmente oferece soluções corporativas que exigem um certo nível de padronização.

Um dos maiores problemas é que as exceções de Java geralmente resultam em um rastreamento de pilha de várias linhas grande nos logs. Por esse motivo, em vez de um único evento de log indicando uma exceção ou uma mensagem de erro, você tem mais de 100 logs diferentes, um para cada linha do rastreamento de pilha, intercalados com outros eventos de log de outros serviços ou instâncias de serviço.

Este artigo descreve como configurar o aplicativo Spring Boot para recolher exceções em uma única linha para o Logback Logger e o Log4j2. Isso nos permite considerar o log de exceção e o rastreamento de pilha como um log de eventos.


Classes de erro e exceção em JAVA


Exceções de exceção JAVA verificadas e desmarcadas

Spring Music App


Neste artigo, para o log personalizado, é usada uma versão personalizada do aplicativo spring-music , necessária para a operação dos registradores Logback e Log4j2. Primeiro, você precisa garantir que possamos recriá-lo a partir da fonte. O projeto requer Java8, portanto, o primeiro passo é instalar o Java8 em seu host Ubuntu.



Em seguida, pegamos o código-fonte do projeto com o github e criamos a montagem usando os scripts internos do sistema de construção Gradle:



Recolher exceções de várias linhas usando o Logback


Vamos seguir em frente e criar um arquivo jar do projeto jar com a implementação do logback Logger usando o comando Gradle padrão:



O arquivo “build / libs / spring-music.jar” é auto-executável e contém um Tomcat interno vinculado ao localhost: 8080. O arquivo jar é chamado usando o comando:



Se você chamar http: // localhost: 8080 no navegador, será exibida uma página com uma lista de álbuns, e a linha de log com esta aparência será exibida no console:



Essa sintaxe da linha de log é definida em " src / main / resources / logback-spring.xml " usando um modelo personalizado:



As variáveis ​​$ {...} são extraídas de application.properties e propriedades do sistema, que podem ser visualizadas na página em http: // localhost: 8080 / env . No entanto, a parte do código que precisamos está localizada imediatamente após a mensagem (% m).



A palavra 'MULTIEXCEPTION' não tem significado especial, é apenas um marcador de string exclusivo que nos permite descobrir onde a mensagem termina (% m) e a exceção começa. Se você quiser, pode deixar este marcador.

Além disso, em vez de simplesmente inserir um espaço reservado% xException que geraria um grande rastreamento de pilha com caracteres de nova linha, convertemos o valor usando a função% replace e substituímos todos os caracteres de nova linha pela expressão "\ u2028", que é uma exibição de delimitador de seqüência de caracteres Unicode .

Remover os caracteres "\ n" do rastreamento de pilha significa que agora o rastreamento de pilha será enviado no formato de linha única. Para provar isso, vá para http: // localhost: 8080 / errors / throw , onde há um Controlador de Erros que lança intencionalmente uma NullPointerException com o seguinte código:



Isso cria uma linha de log no console, mostrada abaixo:



Pode ser visto aqui que a expressão “u2028” separa o que costumava ser um feed de linha no rastreamento de pilha. Agora a mensagem de exceção e o rastreamento da pilha serão enviados como uma unidade.



Recolher exceções de várias linhas usando o Log4j2


Para substituir o script de construção padrão e usar o Log4j2 como a implementação de backup deste projeto, você precisa usar o arquivo "build-log4j2.gradle".



O arquivo “build / libs / spring-music.jar” é auto-executável e usa o Tomcat interno, que é vinculado ao localhost: 8080. Como no exemplo anterior, o arquivo jar é chamado usando o comando:



Chamar http: // localhost: 8080 usando um navegador exibirá uma página com uma lista de Álbuns com uma saída de linha de log para o console semelhante a esta:



Essa sintaxe da linha de log é definida em “ src / main / resources / log4j2.xml ” usando um modelo customizado:



As variáveis ​​$ {...} são extraídas de application.properties e propriedades do sistema, que podem ser visualizadas na página em http: // localhost: 8080 / env . No entanto, a parte do código que precisamos está localizada imediatamente após a mensagem (% m).



A palavra 'MULTIEXCEPTION' não tem significado especial, é apenas um marcador de linha exclusivo de nossa escolha, que permite descobrir onde a mensagem termina (% m) e a exceção começa. Se você quiser, pode deixar.

Mas depois disso, em vez de apenas inserir um espaço reservado% xException que geraria um rastreamento de pilha grande com caracteres de nova linha, convertemos o valor com a função% replace, que substitui todos os caracteres de nova linha pela expressão "\ u2028", que é um delimitador Strings Unicode .

Remover os caracteres "\ n" do rastreamento de pilha significa que agora o rastreamento de pilha será enviado como uma única linha. Para provar isso, vá para http: // localhost: 8080 / errors / throw , onde há um Controlador de Erros que lança intencionalmente uma NullPointerException com o seguinte código:



Isso cria uma linha de log no console, mostrada abaixo:



Como você pode ver, aqui a expressão “u2028” separa o que costumava ser um feed de linha no rastreamento de pilha. Agora a mensagem de exceção e o rastreamento da pilha serão enviados como uma unidade.

Conclusões


A capacidade de recolher o rastreamento de várias linhas da pilha Java em uma linha significa que essa técnica pode ser considerada como uma única solução de log centralizada.
Não há razão para desperdiçar recursos computacionais e humanos na restauração do rastreamento de pilha no lado do destino, usando identificadores de correlação, tamanhos grandes de pilha, alta utilização do processador e análise inteligente, se for muito mais eficiente executar essa dobra no lado de origem.

Nesse caso, o caractere Unicode sempre pode ser substituído no lado dos logs de coleta (por exemplo, no lado do pipeline para coletar, filtrar e normalizar logs do Logstash) para restaurar a mensagem em seu formato original.

Material de referência



Um pouco de publicidade :)


Obrigado por ficar conosco. Você gosta dos nossos artigos? Deseja ver materiais mais interessantes? Ajude-nos fazendo um pedido ou recomendando aos seus amigos o VPS baseado em nuvem para desenvolvedores a partir de US $ 4,99 , um analógico exclusivo de servidores básicos que foi inventado por nós para você: Toda a verdade sobre o VPS (KVM) E5-2697 v3 (6 núcleos) 10GB DDR4 480GB SSD 1Gbps de 10GB de US $ 19 ou como dividir o servidor? (as opções estão disponíveis com RAID1 e RAID10, até 24 núcleos e até 40GB DDR4).

Dell R730xd 2 vezes mais barato no data center Equinix Tier IV em Amsterdã? Somente temos 2 TVs Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV a partir de US $ 199 na Holanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - a partir de US $ 99! Leia sobre Como criar um prédio de infraestrutura. classe usando servidores Dell R730xd E5-2650 v4 custando 9.000 euros por um centavo?

Source: https://habr.com/ru/post/pt482804/


All Articles