Boas Práticas de Logging

Boas Práticas de Logging

Logging é um mecanismo essencial para observabilidade, diagnóstico e auditoria. Uma estratégia consistente de logs reduz custos de manutenção e diminui o tempo médio para resolução de incidentes (MTTR). Pesquisas de mercado indicam que times com observabilidade madura reduzem cerca de 45% o tempo na identificação da causa raiz de falhas.

A seguir, são apresentadas práticas recomendadas para padronizar e qualificar o uso de logs.


1. Bibliotecas Suportadas

Atualmente, as bibliotecas oficialmente suportadas são:

  • Log4J1
    • JUL (Java Util Logging)

      Observação: Antes de adicionar bibliotecas de terceiros, verifique compatibilidade, política corporativa e impacto em runtime.


2. Níveis de Log

Utilize níveis de log de forma intencional. O nível escolhido impacta diretamente no volume de logs, custos de armazenamento e esforço de análise.

NívelSignificadoUso recomendado
TRACEDetalhamento extremo da execuçãoApenas para depuração profunda, geralmente desativado em produção
DEBUGInformações internas úteis para devFluxos específicos durante análise de desenvolvimento
INFOEventos esperados do sistemaConfirma ações concluídas, inicializações, checkpoints
WARNSituação anômala, mas que não impede continuidadeDados incompletos, entradas suspeitas, timeouts recuperáveis
ERRORFalha que impacta funcionalidadeExceções, falhas em integrações, perda parcial de operação
FATAL / SEVEREFalha críticaInterrupção completa da aplicação ou perigo de corrupção de dados

Consequência do mau uso: excesso de logs em ERROR aumenta ruído e dificulta detecção de falhas reais.


3. Mensagens Claras e Contextualizadas

Mensagens devem explicar o que aconteceu, onde aconteceu e (quando possível) por que aconteceu.

Inclua contexto (IDs, usuário, entidade, origem).

Exemplo incorreto:

"Erro ao processar pedido"

Exemplo adequado:

"Erro ao processar pedido ID=12345, cliente='joao.silva': falha na conexão com o banco"

Ao registrar exceções, inclua o Throwable para garantir o stack trace:

Logger logger = Logger.getLogger(MeuServico.class.getName());

try {
    executar();
} catch (Exception e) {
    logger.log(Level.ERROR, "Erro na rotina de faturamento", e);
}

4. Volumes e Impactos

Logging excessivo aumenta:

  • Custo de armazenamento
    • Latência devido a I/O
      • Dificuldade de análise

        Dica: Logue somente o necessário. Dados sensíveis devem ser anonimizados.


5. Consistência e Padronização

  • Padronize prefixos, mensagens e formato.
    • Evite concatenar strings manualmente — prefira placeholders.
      • Utilize MDC (Log4j) (Mapped Diagnostic Context) para anexar informações automaticamente (ex: requestId).

        Exemplo:

        MDC.put("requestId", req.getId());
        logger.info("Iniciando processamento do pagamento");

6. Boas Práticas Resumidas

✅ Use nível adequado ✅ Forneça contexto ✅ Registre exceções com stack trace ✅ Evite informações sensíveis ✅ Otimize o volume de logs


Seguir essas práticas resulta em diagnóstico mais rápido, menor custo operacional e maior confiabilidade no ciclo de desenvolvimento e manutenção.