Guía práctica para implementar logs estructurados en JSON y correlación de peticiones para depuración en producción
Por Kevin Marcondes · Publicado el · Actualizado el · 9 min de lectura
Esta guía práctica muestra cómo implementar logs estructurados en JSON y la correlación de peticiones para depurar en producción. Verás modelos de campos, generación y propagación de IDs, niveles y muestreo, privacidad, pasos de implementación e integración con tracing. Incluye un checklist final para adoptar la práctica de forma segura y sin ruido.
Por qué usar logs estructurados y correlación en producción
Los logs en texto libre dificultan los filtros, las alertas y la auditoría. Con JSON, cada evento se convierte en un objeto consultable. La correlación conecta llamadas entre servicios, colas y jobs, revelando el recorrido de una petición y reduciendo el tiempo de diagnóstico.
El resultado práctico: búsquedas precisas, dashboards fiables y la capacidad de reproducir escenarios. Esto impacta directamente en soporte, SRE e ingeniería de confiabilidad, sin depender de memoria o grep manual en múltiples instancias.
Modelo de evento: campos esenciales en el JSON
Estandariza el esquema antes de instrumentar. Define claves estables, tipadas y documentadas. Evita claves dinámicas. A continuación, un conjunto de campos que cubre la mayoría de escenarios web, de colas y jobs.
Ejemplo de evento HTTP bien 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 en UTC)
- level (debug|info|warn|error)
- message (resumen humano)
- service, env, version (identidad del servicio)
- trace_id, span_id, request_id (correlación)
- user.id/hash, session.id (si aplica y sin PII sensible)
- http.method, http.path, http.status, latency_ms
- error.type, error.message, error.stack (cuando haya)
- event.name, event.version, tags (clasificación y evolución)
IDs de correlación: generar y propagar entre servicios y colas
El ID debe nacer en la frontera (gateway, primer servicio) y acompañar toda la cadena. En HTTP, adopta el estándar W3C Trace Context y mantiene compatibilidad con X-Request-Id cuando sea necesario. Para gRPC y mensajería, usa metadatos propios.
Asegura que middlewares/interceptores creen el ID cuando falte, validen el formato y siempre registren el mismo valor en cada evento del flujo. Devuelve el ID en las respuestas para que soporte pueda reproducir búsquedas.
| Contexto | Propagación del ID | Campo en el log | Notas |
|---|---|---|---|
| HTTP | Header W3C traceparent; fallback X-Request-Id | trace_id, span_id, request_id | Devolver el ID en las respuestas para soporte |
| gRPC | Metadata traceparent o grpc-trace-bin | trace_id, span_id | Usar interceptors para inyectar/extraer |
| Mensajería (SQS/Kafka/Pub/Sub) | Atributo correlation_id y opcional causation_id | correlation_id, message_id, causation_id | Copiar IDs en reprocesamientos y DLQ |
| Jobs/CRON | Generar nuevo correlation_id por ejecución | correlation_id, job_name | Propagar a subtareas y webhooks |
| Webhooks externos | Enviar traceparent; registrar event_id del proveedor | trace_id, provider_event_id | Mapear el ID externo a tu correlation_id |
Niveles de log, muestreo y privacidad en producción
Mantén DEBUG desactivado por defecto en producción. Actívalo de forma selectiva mediante flag o sampling para endpoints críticos. INFO cubre el flujo normal; WARN destaca comportamientos atípicos; ERROR y FATAL representan fallos.
El muestreo reduce coste y ruido en alto volumen: registra 100% de errores y una fracción de eventos exitosos. Evita PII y secretos en los logs. Aplica enmascaramiento y hashing para datos sensibles. Las políticas deben respetar requisitos internos y regulatorios.
Si tu API usa autenticación y límites, alinea headers y respuestas con tu política de seguridad. Consulta buenas prácticas relacionadas en 'Guía de APIs seguras con OAuth2 y rate limiting'.
Para revisar exposiciones de datos en mensajes de error y stacks, un enfoque estructurado ayuda. Referencia relacionada: 'Auditoría de código y plan de corrección de vulnerabilidades en aplicaciones web internas'.
Implementación paso a paso (instrumentación y ejemplos)
1) Elige una biblioteca con formatter JSON y contexto por petición. Ej.: los distintos lenguajes ofrecen opciones maduras para logs estructurados. Estandariza la salida a STDOUT o a un agente ligero.
2) Crea middleware/interceptor: extrae traceparent/X-Request-Id; genera uno nuevo si falta; adjúntalo al contexto del logger. Registra inicio y fin de cada petición con latencia y status.
3) Para llamadas salientes, inyecta el traceparent en el cliente HTTP/gRPC. En mensajes, rellena correlation_id. En jobs, genera y reutiliza el mismo ID.
4) Modela errores: incluye error.type, message y stack resumida. Evita volcar objetos inmensos. Define límites de tamaño.
5) Prueba en staging con carga y caos controlados. Automatiza validaciones en el pipeline de CI/CD para garantizar esquema y campos obligatorios.
Si usas pipelines, incorpora checks de formato y muestreo en el deploy con la guía 'CI/CD con GitHub Actions: guía PHP/Laravel'.
- Middleware HTTP/gRPC: creación/propagación de IDs
- Logger con contexto: inyecta service, env, trace_id
- Eventos canónicos: http_request, db_query, job_run
- Tratamiento de errores estandarizado y redaction
- Tests de contrato de log en CI (esquema JSON)
Centralización, retención y consulta eficiente
Agrega logs en un único backend. Esto facilita la correlación y las investigaciones. Usa índices por time/unit y distintas retenciones para producción y staging. Monitorea la cardinalidad de las claves para evitar costes elevados.
Las plataformas populares ofrecen soporte nativo a JSON y consultas por campos. Ejemplos útiles:
En AWS CloudWatch Logs Insights, busca por trace_id y agrega latencia. Doc de referencia: AWS CloudWatch Logs Insights.
En Google Cloud Logging, usa resource.type, labels, trace y jsonPayload para filtros avanzados.
Estandariza el despliegue de estas configuraciones junto al proceso de entrega. Una auditoría del pipeline ayuda a evitar regresiones: 'Auditoría de procesos de deploy y plan de corrección'.
- Define retención por criticidad y coste
- Estandariza nombres de log streams y labels
- Crea saved queries y paneles por servicio
- Alertas por tasa de error y p95 de latencia
- Rutinas de limpieza y tests de restauración
Integración con tracing y métricas (observabilidad)
Adopta W3C Trace Context para que logs, métricas y traces puedan interoperar. Registra trace_id y span_id en los logs. Así, una alerta en métricas conduce a un trace, que a su vez conduce a eventos detallados.
Para HTTP, el header estándar está documentado en MDN. En la nube, usa integraciones nativas para correlacionar trace_id con registros de log.
Incluso sin una suite completa de APM, puedes crear el vínculo mínimo: IDs consistentes, muestreo inteligente y consultas guardadas por incidente.
- Registrar trace_id/span_id en 100% de los eventos de error
- Enlace bidireccional: el trace apunta a logs y viceversa
- Métricas con labels de correlation_id en jobs críticos
Checklist de adopción y trampas comunes
Usa esta lista para validar la preparación antes de ampliar a 100% del tráfico. Reduce retrabajo y asegura que la inversión en observabilidad genere resultados prácticos.
- Esquema JSON versionado y documentado
- Generación y propagación de correlation_id estables
- Enmascaramiento de PII y secretos validado
- Sampling y niveles por ruta/servicio definidos
- Consultas y dashboards guardados por equipo
- Alertas de error y latencia conectadas al ID
- Tests de contrato de log en CI
- Playbooks de incidentes que enlacen búsquedas por trace_id
- Revisión trimestral de costes y cardinalidad
Preguntas frecuentes
¿Qué ID debo usar para correlación: trace_id o request_id?
Mantén trace_id como identificador canónico de extremo a extremo siguiendo W3C Trace Context; usa request_id cuando el gateway lo estandarice. Registra ambos cuando existan y prioriza trace_id para búsquedas y correlación entre servicios. Asegura que el ID nazca en la frontera, que middleware lo valide y que se devuelva en respuestas para facilitar la reconstrucción del flujo en producción.
¿Cómo activar DEBUG en producción sin disparar costes?
Activa DEBUG mediante feature flags y combina con sampling para limitar el volumen; habilítalo solo en servicios o rutas específicas y por ventanas cortas. Mantén 100% de registro de errores y muestrea una fracción de éxitos. Automatiza la desactivación tras el diagnóstico y define reglas por ruta/servicio para evitar costes y ruido en producción.
¿Puedo almacenar logs en la base transaccional?
Evita almacenar logs en la base transaccional: el volumen y la cardinalidad perjudican rendimiento y aumentan costes. Prefiere un backend de logs o una solución de time series. Si es imprescindible a corto plazo, crea tablas dedicadas con baja retención y partición, y trata esa solución como temporal mientras se migra a una plataforma de logs centralizada.
¿Cómo tratar PII y secretos en los logs?
Aplica redaction por defecto: elimina o enmascara tokens, contraseñas y datos personales; registra identificadores no sensibles como user.hash. Revisa mensajes de error y stacks para evitar exposiciones. Documenta y automatiza las reglas de enmascaramiento, realiza code reviews con foco en privacidad y valida que las políticas cumplan requisitos regulatorios antes de ampliar el muestreo en producción.
¿Qué registrar en tareas asíncronas y colas?
Genera un correlation_id al inicio del job y propágalo en cada mensaje; registra intentos, retrasos, envíos a DLQ y los IDs relevantes del proveedor. Añade campos de causation para reconstruir la cadena entre mensajes y servicios. Asegúrate de que consumidores y productores loguen con el mismo ID para permitir búsquedas y diagnósticos completos.
¿Cómo empezar sin rediseñar todo?
Empieza por un servicio de borde: estandariza el esquema JSON e implementa middleware que extraiga o genere traceparent/X-Request-Id e inyecte el ID en el contexto del logger. Centraliza logs en un backend y crea consultas guardadas por trace_id y por errores recientes. Expande gradualmente a servicios vecinos y valida el esquema en CI con el checklist de adopción.
¿Necesitas estandarizar logs y correlación en tu stack?
Podemos conversar sobre auditoría de esquema, instrumentación de middleware y rollout seguro en producción. Aporta contexto de tu entorno y exploramos el siguiente paso.
Hablar sobre implementación de logsVer también
- Guía: checklist de pre‑deploy y plan de rollback rápido para aplicaciones PHP en producción
- Checklist de seguridad para pipelines CI/CD con runners self‑hosted y gestión de secretos
- Guía: centralización de logs con Fluentd y Elasticsearch para aplicaciones PHP en VPS
- Guía: organizar migraciones y rollbacks en PostgreSQL para equipos pequeños