Pular para o conteúdo principal

Antes de debugar, tente logar - Um panorama do Log4J


Não pretendo, com este post, advogar contra o processo de depuração. Muitos erros só são resolvidos com uma boa debugada no código, não tem jeito. O objetivo aqui é incentivar a arte de logar. Logar em diversos níveis e em diversos pontos do seu projeto/sistema/API.

Você não precisa acreditar em mim. Acredite em todas as bibliotecas que você utiliza, que emitem mensagens para te auxiliar o tempo todo. Não seria bom que quem usa suas bibliotecas e/ou APIs pudessem ter a seu dispor o mesmo nível de auxílio?

Meu primeiro exemplo vem de um caso prático que passei. Estava passando por problemas no VRaptor (para quem não conhece, o VRaptor é um framework Java MVC que te auxilia magnificamente na construção de controllers, lidando muito bem com a camada Web e permitindo até a construção de serviços REST), e percebia que o debug não estava me dando as informações necessárias para resolver meu problema. Foi quando mexi no arquivo de configuração do Log4J e aumentei o nível de log do framework. Pronto! Rapidamente, as informações que precisava foram registradas no arquivo de log e eu consegui avançar e resolver o maldito bug.

Não perca tempo tentando construir seu próprio logger. Já temos muitos esforços prontos e disponíveis. Então, o ideal é não tentar reinventar a roda e utilizar um framework já pronto. No backend, tecnologia Java, o Log4J reina absoluto como o framework de log mais conhecido e utilizado. Sua performance é preparada para altos níveis de log, então não fique com medo de adicionar uma chamada ao log. Fique sim, atento, ao nível de log que você utilizará. O Log4J (e diversos outros frameworks Java) utilizam uma hierarquia de níveis para controlar quais mensagens serão adicionadas ao log. Eis os níveis e seus significados semânticos:

  • OFF - indica que nenhuma mensagem de log será adicionada.
  • FATAL - erros fatais em sua biblioteca ou sistema.
  • ERROR - outros tipos de erros (não fatais).
  • WARN - avisos sobre uso de métodos deprecated, uso errôneo da API, e outras mensagens que não indicam erro mas devem ser avisadas para o usuário da biblioteca/sistema.
  • INFO - mensagens que são interessantes para o usuário, como conexões, inicializações e outras similares.
  • DEBUG - neste nível devem entrar mensagens que ajudarão o usuário de sua biblioteca ou sistema a resolver algum tipo de problema que ele esteja atravessando - valores de variáveis internas, tratamento de parâmetros passados, coisas desse tipo. Você, como construtor da biblioteca, vai saber o que será importante logar nesse nível.
  • TRACE - este nível deve trazer detalhes internos da biblioteca que ajudariam você a resolver algum problema. Imagine que nem sempre você poderá ter acesso ao ambiente de produção, então habilitar o log neste nível deve lhe fornecer informações detalhadas que te permitam agir.
  • ALL - nível que engloba todos os outros níveis.

Esses níveis funcionam de forma cumulativa. Se você definir o nível de seu log para WARN, por exemplo, todas as mensagens com nível igual ou inferior a WARN serão incluídas, e assim por diante. Temos a seguinte comparação entre os níveis: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF.

Quando você está construindo um sistema que vai utilizar o Log4J como ferramenta de log, você configura com um arquivo XML ou um arquivo properties; eu, particularmente, prefiro o properties e é o que vou utilizar como exemplo.

Um dos conceitos importantes ao configurar o log é o Appender. Um Appender é uma classe (que estende uma interface do Log4J) que vai entregar as mensagens de log geradas pela sua biblioteca ou sistema para o seu destino. Você pode ter diversos destinos configurados, ou seja, você irá enviar suas mensagens de log para diversos destinos: o console, um arquivo texto, um banco de dados, etc.

Um exemplo rápido de um arquivo properties de configuração do Log4J seria este:

log4j.rootLogger=DEBUG, consoleAppender, fileAppender

log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender

log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout

log4j.appender.consoleAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n

log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender

log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout

log4j.appender.fileAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n

log4j.appender.fileAppender.File=biblioteca_x.log

Neste exemplo, temos dois Appenders: consoleAppender e fileAppender. Ou seja, nossas mensagens de log serão enviadas para o console e para um arquivo. E o nível de log escolhido foi DEBUG (um nível alto; todas as mensagens dos níveis DEBUG, INFO, WARN, ERROR e FATAL serão incluídas). No exemplo também podemos ver o nome do arquivo de log (biblioteca_x.log), uma estratégia de rolagem dos arquivos (geralmente a estratégia é um arquivo por dia) e também o formato das mensagens - aquele formato indicado no ConversionPattern.

Beleza, muito legal tudo isso que eu falei, mas você não utiliza Java no backend. Tranquilo, o Log4J foi portado para outras tecnologias/linguagens. Temos o Log4C (para a linguagem C), Log4JS (para o Javascript, inclusive disponível no NodeJS), Log4Net (para o framwork .Net), Log4PHP (para a linguagem PHP) e muitos outros.

Este post vai ter continuação. No próximo post desta série, detalho um pouco mais o funcionamento do Log4J. Um abração e até o próximo post!!


Comentários

Postagens mais visitadas deste blog

Jakarta EE 10, A nova versão corporativa do Java

Mais de um ano atrás, fiz um post sobre o lançamento da versão 9.1 do Jakarta EE (confira esse post aqui ). Nesse post, eu expliquei um pouco sobre a transferência do Java EE da Oracle para a Eclipse Foundation e a mudança necessária ocorrida nessa versão no nome dos pacotes: de javax para jakarta . Agora, acabou de sair uma nova versão do Jakarta EE , versão 10 , a primeira versão que verdadeiramente traz novidades nas especificações que tanto conhecemos: JPA agora evoluiu para a versão 3.1; CDI para a versão 4.0; JAX-RS  para a versão 3.1; e assim por diante. Foram mais de vinte especificações atualizadas / evoluídas nesta versão, que criou também um novo perfil de implementação. Agora, temos três perfis para implementação do Jakarta EE :  Jakarta EE 10 Platform , o perfil completo com todas as especificações (este perfil somente os servidores de aplicação costumam implementar, como Wildfly e Glassfish ); Jakarta EE 10 Web Profile , um perfil com especificações volta...

Maven - Versão nova lançada

  Saiu versão nova do Maven - 3.8.2. Esta foi apenas uma versão de correção de bugs, mas a versão anterior, a 3.8.l, foi uma versão importante e vou aproveitar para falar sobre ela. Quem acompanha o histórico de versões do Maven , deve ter percebido o pulo de versão, da 3.6.3 para esta 3.8.1. A razão está explicada neste link , e o grande motivo foi tentar evitar problemas de segurança pelo acesso a repositórios via protocolo HTTP. Por default, esta versão 3.8.1 do Maven bloqueia o acesso a repositórios HTTP - você precisa acessar repositórios HTTPS . O bloqueio acontece com a adição de um mirror chamado "maven-default-http-blocker", bloqueando todo e qualquer acesso a repositórios HTTP externos. <mirror>    <id>maven-default-http-blocker</id>    <mirrorOf>external:http:*</mirrorOf>   <name>Pseudo repository to mirror external repositories initially using HTTP.</name>    <url>http://0.0.0.0/</u...

Implantando o Flyway em sistemas Java - Parte 1

  Quando temos uma empresa terceirizada de fábrica de software desenvolvendo, geralmente especificamos no edital de licitação que essa empresa precisa entregar alguns artefatos obrigatórios para poder receber pelos serviços prestados: o código-fonte (óbvio!), diagramas UML (quando necessário), evidências de testes (artefato que cada vez mais me convenço que de nada serve)... e um plano de implantação. Esse plano de implantação precisa trazer os passos necessários para colocar o produto no ambiente de homologação (e, posteriormente, no ambiente de produção). Na maioria das vezes, um ou mais scripts de banco de dados que devem ser executados. Nós, servidores, tínhamos que abrir o plano de implantação, verificar os passos, acessar o versionador, abrir a ferramenta de banco de dados, copiar o(s) script(s), executá-los, tudo manualmente, gerando um trabalhinho chato e propenso a erros. Além disso, os scripts sempre ficavam meio perdidos: as vezes espalhados por pastas relativas às orden...