Java Logging Guide: Noções básicas
Arfan Sharif - 13 de fevereiro de 2023
O registro ajuda a entender como um aplicativo é executado ou o que deu errado quando algo falhou. Essas informações podem ser críticas para fins de depuração e auditoria. Os logs mantêm uma trilha de cada evento durante a execução de um programa, tornando esses registros disponíveis para análise posterior.
No entanto, o registro efetivo não ocorre automaticamente. Os desenvolvedores de aplicativos precisam garantir que um aplicativo esteja registrando sistematicamente detalhes importantes em um formato fácil de processar.
A abordagem mais rudimentar para o registro é o uso simples de instruções de impressão para exibir os detalhes do aplicativo desejado. Obviamente, essa não é uma abordagem ideal pelos seguintes motivos:
Por todos esses motivos, muitas linguagens de programação, como Java, incluem APIs e estruturas de registro dedicadas. Nesta visão geral — a primeira parte da série — apresentaremos os conceitos básicos de criação de log para aplicativos Java. Veremos as opções de registro e, em seguida, consideraremos várias estruturas de registro disponíveis e suas configurações com suporte.
Explore a série completa do Java Logging Guide:
Como tudo mais em sua arquitetura, o Java adota uma abordagem extensível e personalizável para registro. A estrutura java.util.logging é a opção padrão para todas as funções relacionadas à criação de log. Essa estrutura fornece todos os recursos básicos necessários para registro enquanto permite que estruturas de terceiros estendam esses recursos.
Essa estrutura de registro inclui três módulos principais:
Outro conceito digno de nota aqui é o Filtro. Os filtros permitem que o desenvolvedor intercepte um LogRecord e decida qual manipulador deve ser usado. Embora desnecessários para registro básico, os filtros podem ajudar a atender a requisitos complexos de registro.
Para a estrutura de log do Java, o local de saída padrão é o diretório inicial do usuário.
Embora a estrutura de log do Java forneça todos os recursos básicos, as estruturas de terceiros podem fazer bastante combinando Loggers, Handlers e Formatters. Log4j 2 e Logback são duas estruturas de registro populares, cada uma com seus próprios pontos fortes.
Como várias estruturas estão disponíveis para Java e seus conjuntos de recursos estão sempre evoluindo, os desenvolvedores geralmente desejam tentar algo diferente. É aqui que os abstratores de registro entram em ação. Os abstratores permitem que os desenvolvedores alternem rapidamente entre as estruturas de log usando uma especificação de função padrão. Simple Logging Facade for Java (SLF4J) é um abstrator de registro popular que suporta a estrutura padrão, Log4j 2 e Logback. Apache commons-logging é outro abstrator.
É importante observar, no entanto, que as versões sem patch do Log4j 2 representam um risco de segurança crítico (CVE-2021-44228). Embora menos graves, também existem riscos de segurança consideráveis para Log4j 1.x (CVE-2021-4104) e Logback (CVE-2021-42550). Como o uso de abstratores ainda depende dessas estruturas subjacentes, é imperativo que essas bibliotecas vulneráveis sejam devidamente atualizadas e corrigidas para uso seguro.
A estrutura padrão usa um arquivo de configuração para definir os detalhes de anexadores, registradores e layouts. Por padrão, este arquivo está presente na pasta lib do diretório de instalação do Java, mas este é um arquivo de configuração global.
É uma boa prática definir um arquivo de configuração específico do aplicativo. Você pode fazer isso especificando o nome do arquivo de propriedades ao iniciar o aplicativo, conforme mostrado abaixo:
Um arquivo de configuração simples ficará assim:
Aqui, a configuração registrará os eventos do aplicativo em um arquivo que será criado no diretório pessoal do usuário. O valor %h denota o diretório inicial e %u denota um número exclusivo arbitrário que java definirá para distinguir entre arquivos de log.
Agora, para criar um novo arquivo de log a partir de uma nova classe, você pode usar o trecho de código abaixo:
Quando e o que registrar depende inteiramente do desenvolvedor do aplicativo e depende da estratégia de registro adotada pela equipe do aplicativo. Depois que o desenvolvedor decide quais eventos registrar, o registro requer apenas uma única linha de código. Aqui está um exemplo: