Registro em aplicações Java: melhores práticas na prática
Registro não é apenas gravar mensagens no console. Em aplicações Java modernas, um sistema de registro bem configurado é a base para monitoramento, depuração, auditoria e análise de incidentes. Sem ele, o desenvolvedor está cego e o DevOps está surdo. Neste artigo, abordaremos as melhores práticas de registro em Java com foco na implementação prática: desde a escolha da biblioteca até a configuração de desempenho e segurança.
1. Escolha da stack: SLF4J + Logback como padrão
Hoje, o padrão da indústria é a combinação de SLF4J (Simple Logging Facade for Java) e Logback. SLF4J atua como uma abstração (fachada), permitindo trocar facilmente a implementação no futuro (por exemplo, para Log4j2 ou java.util.logging). Logback é o sucessor do Log4j, mais rápido, com tamanho menor e suporte a recursos modernos (registro assíncrono, filtros condicionais).
Adicione as dependências no pom.xml (Maven):
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.12</version></dependency><dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.6</version></dependency>Para Gradle:
implementation 'org.slf4j:slf4j-api:2.0.12'implementation 'ch.qos.logback:logback-classic:1.5.6'Uso do SLF4J no código:
import org.slf4j.Logger;import org.slf4j.LoggerFactory;
public class OrderService { private static final Logger log = LoggerFactory.getLogger(OrderService.class);
public void processOrder(String orderId) { log.info("Início do processamento do pedido: {}", orderId); // lógica de negócios log.debug("Pedido {} processado com sucesso", orderId); }}Importante: sempre use mensagens parametrizadas ({}), e não concatenação de strings. Isso evita custos adicionais de criação de string se o nível de log estiver desativado.
2. Níveis de registro: quando e qual usar
A escolha correta do nível é metade do sucesso. Em Java (SLF4J/Logback), os seguintes níveis são usados (em ordem crescente de importância):
- TRACE — detalhes mínimos (entrada/saída de métodos, valores de variáveis). Apenas para desenvolvimento, nunca ativar em produção.
- DEBUG — informações para o desenvolvedor (estado de objetos, resultados de cálculos intermediários). Ativado temporariamente para encontrar problemas.
- INFO — eventos importantes de negócios (inicialização da aplicação, criação de pedido, execução de tarefa). Deve estar sempre ativado.
- WARN — situações potencialmente perigosas (esgotamento do pool de conexões, API obsoleta, baixo desempenho). A aplicação continua funcionando.
- ERROR — erro crítico (exceção, perda de dados, indisponibilidade de serviço externo). Requer intervenção imediata.
Regra prática: em produção, geralmente ativam INFO e acima. DEBUG e TRACE são ativados apenas para um pacote ou classe específica durante a investigação de um incidente.
Exemplo de configuração logback.xml com separação por pacotes:
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy>