Desenvolvimento · Boas Práticas

Logs em produção: boas práticas para encontrar erros rápido sem vazar dados

Edson Feitosa de Oliveira Junior
Edson Feitosa de Oliveira Junior Fundador e Engenheiro Líder · PruPru Digital Services

Logs em produção são a primeira e, muitas vezes, a única fonte de informação quando algo dá errado. Uma aplicação com bons logs permite descobrir a causa de um erro em minutos. Uma aplicação com logs ruins obriga a tentar reproduzir o problema às cegas, ou a adivinhar. E logs mal feitos ainda podem criar um problema novo: vazar senhas e dados pessoais.

Níveis de log: use cada um para o que serve

NívelQuando usarExemplo
ERRORAlgo falhou e precisa de atençãoFalha ao gravar pedido no banco
WARNSituação anormal, mas a aplicação continuouServiço externo lento, nova tentativa feita
INFOEventos importantes do negócio e do sistemaAplicação iniciada, pedido criado, pagamento confirmado
DEBUGDetalhes para investigaçãoParâmetros de uma consulta, decisões internas
TRACEDetalhamento extremoRaramente usado em produção

Em produção, o nível padrão costuma ser INFO. DEBUG pode ser ativado temporariamente para investigar um problema específico.

Erros comuns: registrar tudo como ERROR (o alerta perde o sentido) ou registrar exceções esperadas, como um usuário digitando uma senha errada, como erro do sistema.

Mensagens que ajudam

Compare:

Uma boa mensagem de log diz o que aconteceu, com o quê (identificadores) e por quê, quando se sabe. Ao registrar exceções, inclua a exceção completa, com a stack trace, no nível ERROR. Para interpretar stack traces, veja como ler uma stack trace Java.

Em Java, com SLF4J:

log.error("Falha ao confirmar pagamento do pedido {}", pedidoId, excecao);

Use os parâmetros ({}) em vez de concatenar strings: além de mais eficiente, separa a mensagem dos dados.

Logs estruturados

Em vez de texto livre, registre os logs em JSON, com campos fixos:

{"timestamp":"2026-11-02T14:03:22Z","level":"ERROR","service":"pedidos",
 "requestId":"a1b2c3","pedidoId":8231,"message":"Falha ao confirmar pagamento",
 "error":"GatewayTimeoutException"}

Logs estruturados podem ser filtrados e agregados: "todos os erros do serviço de pedidos na última hora", "tudo o que aconteceu na requisição a1b2c3". O Spring Boot tem suporte a logs estruturados em versões recentes, e bibliotecas como o Logback com encoders JSON fazem isso em versões anteriores. Em Node.js, bibliotecas como pino geram JSON por padrão. Veja JSON para iniciantes.

Identificador de requisição (correlation ID)

Uma única ação do usuário pode gerar dezenas de linhas de log, misturadas com as de outros usuários. Gere um identificador único no início de cada requisição, inclua em todas as linhas de log daquela requisição e devolva no cabeçalho da resposta. Quando um usuário reportar um erro, esse identificador leva direto às linhas certas. Em Java, o MDC (Mapped Diagnostic Context) do SLF4J faz isso de forma transparente.

Em sistemas com vários serviços, propague o identificador entre as chamadas. Padrões como o OpenTelemetry fazem isso automaticamente.

O que nunca registrar nos logs em produção

Logs costumam ser acessados por mais pessoas e guardados por mais tempo do que o banco de dados, e um vazamento de logs é um vazamento de dados para efeitos da LGPD. Veja LGPD para pequenas empresas.

Cuidado especial com logs automáticos de requisições e respostas HTTP completas e com toString() de objetos que contêm campos sensíveis.

Onde guardar os logs

Defina um prazo de retenção: logs não precisam ser guardados para sempre, e guardar menos reduz custo e risco.

Alertas: logs que avisam

Logs que ninguém lê não evitam problemas. Configure alertas para:

Comece com poucos alertas relevantes. Alertas demais viram ruído e são ignorados.

Checklist

Logs bem feitos também ajudam na manutenção preventiva de servidores, mostrando problemas antes que eles virem incidentes.

Na prática da PruPru

Num sistema interno que a PruPru construiu para uma distribuidora de Natal, as telas de relatório estavam lentas mesmo com cache configurado. O que revelou a causa foi justamente o log: com o nível TRACE ligado só para o pacote de cache do Spring, ficou claro que as chamadas internas não geravam nenhuma linha de cache, ou seja, o cache nunca era usado. Ligar o nível detalhado de um único pacote, por pouco tempo, resolveu em minutos o que dias de suposição não resolveram. O caso completo está em @Cacheable não funciona no Spring Boot.

Sistemas sob medida

A PruPru desenvolve APIs, sistemas web e integrações com as mesmas práticas descritas neste guia. Se a sua empresa precisa de software bem construído, conheça os serviços.

Ver serviços →

Perguntas frequentes

Qual nível de log usar em produção?

Em geral, INFO como padrão, com WARN e ERROR para situações anormais. O nível DEBUG pode ser ativado temporariamente para investigar um problema específico e desativado em seguida.

Posso registrar o corpo das requisições nos logs?

Com muito cuidado. Corpos de requisição podem conter senhas, tokens e dados pessoais. Se for necessário, registre apenas campos específicos e mascare dados sensíveis.

O que é log estruturado?

É o log registrado em um formato com campos definidos, como JSON, em vez de texto livre. Ele facilita filtrar, buscar e agregar os registros em ferramentas de análise.

Por quanto tempo devo guardar os logs?

Depende das necessidades do negócio e de obrigações legais. Muitas aplicações guardam logs operacionais por algumas semanas ou meses. Guardar menos reduz custos e o risco em caso de vazamento.

Falar no WhatsApp agora