Guia prático para implementar logs estruturados em JSON e correlação de requisições para debugging em produção
Por Kevin Marcondes · Publicado em · Atualizado em · 8 min de leitura
Este guia prático mostra como implementar logs estruturados em JSON e correlação de requisições para debugging em produção. Você vai ver modelos de campos, geração e propagação de IDs, níveis e amostragem, privacidade, passo a passo de implementação e integração com tracing. Inclui checklist final para adoção segura e sem ruído.
Por que usar logs estruturados e correlação em produção
Logs em texto livre dificultam filtros, alertas e auditoria. Com JSON, cada evento vira um objeto consultável. A correlação conecta chamadas entre serviços, filas e jobs, revelando a jornada de uma requisição e reduzindo o tempo de diagnóstico.
O resultado prático: buscas precisas, dashboards confiáveis e capacidade de reproduzir cenários. Isso impacta diretamente suporte, SRE e engenharia de confiabilidade, sem depender de memória ou grep manual em múltiplas instâncias.
Modelo de evento: campos essenciais no JSON
Padronize o esquema antes de instrumentar. Defina chaves estáveis, tipadas e documentadas. Evite chaves dinâmicas. Abaixo, um conjunto de campos que cobre a maioria dos cenários web, filas e jobs.
Exemplo de evento HTTP bem formado: {"timestamp":"2026-09-27T12:34:56.789Z","level":"info","message":"GET /orders/42","service":"api-gateway","env":"prod","trace_id":"...","span_id":"...","request_id":"...","http":{"method":"GET","path":"/orders/42","status":200,"latency_ms":34},"remote_ip":"203.0.113.10","event":{"name":"http_request","version":"1"}}
- timestamp (ISO‑8601 em UTC)
- level (debug|info|warn|error)
- message (resumo humano)
- service, env, version (identidade do serviço)
- trace_id, span_id, request_id (correlação)
- user.id/hash, session.id (se aplicável e sem PII sensível)
- http.method, http.path, http.status, latency_ms
- error.type, error.message, error.stack (quando houver)
- event.name, event.version, tags (classificação e evolução)
IDs de correlação: gerando e propagando entre serviços e filas
O ID deve nascer na borda (gateway, primeiro serviço) e acompanhar toda a cadeia. Em HTTP, adote o padrão W3C Trace Context e mantenha compatibilidade com X-Request-Id quando necessário. Para gRPC e mensageria, use metadados próprios.
Garanta que middlewares/interceptadores criem o ID quando ausente, validem o formato e sempre loguem o mesmo valor em cada evento do fluxo. Retorne o ID em respostas para que suporte consiga reproduzir buscas.
| Contexto | Propagação do ID | Campo no log | Notas |
|---|---|---|---|
| HTTP | Header W3C traceparent; fallback X-Request-Id | trace_id, span_id, request_id | Devolva o ID em responses para suporte |
| gRPC | Metadata traceparent ou grpc-trace-bin | trace_id, span_id | Use interceptors para injetar/extrair |
| Mensageria (SQS/Kafka/Pub/Sub) | Atributo correlation_id e opcional causation_id | correlation_id, message_id, causation_id | Copie IDs em reprocessamentos e DLQ |
| Jobs/CRON | Gerar novo correlation_id por execução | correlation_id, job_name | Propagar aos subtarefas e webhooks |
| Webhooks externos | Enviar traceparent; logar event_id do provedor | trace_id, provider_event_id | Mapeie o ID externo ao seu correlation_id |
Níveis de log, amostragem e privacidade em produção
Mantenha DEBUG desativado por padrão em produção. Ative de forma seletiva via flag ou sampling para endpoints críticos. INFO cobre fluxo normal; WARN destaca comportamentos atípicos; ERROR e FATAL representam falhas.
Amostragem reduz custo e ruído em alto volume: registre 100% de erros e uma fração de eventos de sucesso. Evite PII e segredos nos logs. Aplique mascaramento e hashing para dados sensíveis. Políticas devem respeitar requisitos internos e regulatórios.
Se a sua API usa autenticação e limites, alinhe cabeçalhos e respostas com sua política de segurança. Veja boas práticas relacionadas em Guia de APIs seguras com OAuth2 e rate limiting.
Para revisar exposições de dados em mensagens de erro e stacks, uma abordagem estruturada ajuda. Referência relacionada: Auditoria de código e plano de correção web.
Implementação passo a passo (instrumentação e exemplos)
1) Escolha uma biblioteca com formatter JSON e contexto por requisição. Ex.: linguagens oferecem opções maduras para logs estruturados. Padronize a saída em STDOUT ou para um agente leve.
2) Crie middleware/interceptor: extraia traceparent/X-Request-Id; gere um novo quando ausente; anexe ao contexto do logger. Logue início e fim de cada requisição com latência e status.
3) Para chamadas saindo do serviço, injete o traceparent no cliente HTTP/gRPC. Em mensagens, preencha correlation_id. Em jobs, gere e reutilize o mesmo ID.
4) Modele erros: inclua error.type, message e stack resumida. Evite despejar objetos gigantes. Defina limites de tamanho.
5) Teste em ambiente de staging com carga e caos controlados. Automatize validações no pipeline de CI/CD para garantir esquema e campos obrigatórios.
Se você usa pipelines, veja como incorporar checks de formato e amostragem no deploy em CI/CD com GitHub Actions: guia PHP/Laravel.
- Middleware HTTP/gRPC: criação/propagação de IDs
- Logger com contexto: injeta service, env, trace_id
- Eventos canônicos: http_request, db_query, job_run
- Tratamento de erros padronizado e redaction
- Testes de contrato de log no CI (esquema JSON)
Centralização, retenção e consulta eficiente
Agregue logs em um único backend. Isso facilita correlação e investigações. Use índice por time/unit e retenções diferentes para produção e staging. Monitore cardinalidade de chaves para evitar custos.
Plataformas populares oferecem suporte nativo a JSON e consultas por campos. Exemplos úteis:
No AWS CloudWatch Logs Insights, pesquise por trace_id e agregue latência. Doc de referência: AWS CloudWatch Logs Insights.
No Google Cloud Logging, use resource.type, labels, trace e jsonPayload para filtros avançados.
Padronize a implantação dessas configurações junto ao processo de entrega. Uma auditoria de pipeline ajuda a evitar regressões: veja Auditoria de processos de deploy e plano de correção.
- Defina retenção por criticidade e custo
- Padronize nome de log streams e labels
- Crie saved queries e painéis por serviço
- Alertas por taxa de erro e p95 de latência
- Rotinas de limpeza e testes de restauração
Integração com tracing e métricas (observabilidade)
Adote o W3C Trace Context para que logs, métricas e traces conversem. Grave trace_id e span_id nos logs. Assim, um alerta em métricas leva a um trace, que leva a eventos detalhados.
Para HTTP, o header padrão é documentado em MDN. Em nuvem, use integrações nativas para correlacionar trace_id com registros de log.
Mesmo sem uma suite completa de APM, você pode criar o elo mínimo: IDs consistentes, amostragem inteligente e consultas salvas por incidente.
- Grave trace_id/span_id em 100% dos eventos de erro
- Link bidirecional: trace aponta para logs e vice-versa
- Métricas por label correlation_id em jobs críticos
Checklist de adoção e armadilhas comuns
Use esta lista para validar a prontidão antes de expandir para 100% do tráfego. Ela reduz retrabalho e garante que o investimento em observabilidade gere resultados práticos.
- Esquema JSON versionado e documentado
- Geração e propagação de correlation_id estáveis
- Mascaramento de PII e segredos validado
- Sampling e níveis por rota/serviço definidos
- Consultas e dashboards salvos por time
- Alertas de erro e latência conectados ao ID
- Testes de contrato de log no CI
- Playbooks de incidentes linkando buscas por trace_id
- Revisão de custos e cardinalidade trimestral
Perguntas frequentes
Qual ID devo usar para correlação: trace_id ou request_id?
Mantenha trace_id como identificador canônico de ponta a ponta, seguindo o W3C Trace Context. Use request_id quando seu gateway já padroniza esse cabeçalho. Se ambos existirem, registre os dois e priorize trace_id para buscas.
Como ativar DEBUG em produção sem explodir custos?
Use feature flags para habilitar DEBUG apenas em serviços ou rotas específicas, por janelas de tempo curtas. Combine com sampling. Mantenha 100% dos erros e uma fração dos sucessos. Desligue automaticamente após o diagnóstico.
Posso armazenar logs no banco transacional?
Evite. Bancos transacionais sofrem com volume e cardinalidade dos logs. Prefira serviços de logs ou timeseries. Se precisar de curto prazo, use tabelas dedicadas com retenção baixa e partições, mas trate como medida temporária.
Como lidar com PII e segredos nos logs?
Adote redaction por padrão. Remova ou masque tokens, senhas e dados pessoais. Padronize chaves seguras (ex.: user.hash). Revise mensagens de erro e stacks. Treine a equipe e faça code reviews focados em privacidade.
O que registrar em tarefas assíncronas e filas?
Gere correlation_id no início do job e propague em cada mensagem produzida. Logue tentativas, atrasos, DLQ e IDs do provedor. Mantenha campos de causation para reconstruir cadeias entre mensagens e serviços.
Como começar sem reprojetar tudo?
Escolha um serviço de borda, padronize o esquema JSON e implemente middleware de correlação. Centralize em um backend de logs e crie duas consultas salvas: por trace_id e por erro recente. Expanda gradualmente para serviços vizinhos.
Precisa padronizar logs e correlação na sua stack?
Podemos conversar sobre auditoria de esquema, instrumentação de middleware e rollout seguro em produção. Traga contexto do seu ambiente e exploramos o próximo passo.
Falar sobre implementação de logsVeja também
- Guia: checklist de pré‑deploy e plano de rollback rápido para aplicações PHP em produção
- Checklist de segurança para pipelines CI/CD com runners self‑hosted e secrets management
- Guia: centralização de logs com Fluentd e Elasticsearch para aplicações PHP em VPS
- Guia: organizar migrations e rollbacks em PostgreSQL para equipes pequenas