Registros Estructurados en JSON: Guía Práctica para Desarrolladores
Los registros son una parte esencial de la observabilidad en sistemas distribuidos modernos. A diferencia de métricas y trazas, los logs ofrecen la mayor flexibilidad para analizar eventos de la aplicación. Esta guía presenta patrones concretos para implementar un registro efectivo usando formato JSON estructurado, contexto MDC y una clara separación de niveles de error.
Por qué los Registros Estructurados Superan al Texto Plano
Los logs tradicionales en texto plano son fáciles de leer en la consola, pero generan grandes dolores de cabeza para el procesamiento automatizado. Analizarlos requiere patrones regex complejos, extraer datos específicos es complicado y cambiar el formato es una pesadilla. En sistemas distribuidos donde los incidentes exigen un análisis rápido de múltiples fuentes, estos problemas se convierten en obstáculos insalvables.
Los registros JSON estructurados resuelven estos inconvenientes:
- Simplifican la búsqueda y filtrado por campos específicos
- Permiten indexación parcial en sistemas de búsqueda
- Automatizan la extracción de datos post-incidente
- Facilitan el filtrado de datos personales y la adición de metadatos
Ejemplo de un log ineficaz en texto plano:
2025-03-15 10:16:01.795 INFO 12345 --- [nio-8080-exec-1] c.e.UserController : Usuario guardado en BD: User{id=123, [email protected], role=USER}
Ejemplo de un log estructurado en JSON:
{
"timestamp": "2025-03-22T10:15:30.123Z",
"level": "ERROR",
"service": "auth-service",
"traceId": "1fd7a997-6517-4b63-9baa-4238f8012734",
"entrypoint": "HTTP request POST /api/user/auth",
"message": "Fallo al autenticar usuario",
"user_id": "user-789",
"error": {
"type": "InvalidCredentials",
"details": "La contraseña proporcionada no coincide"
}
}
Contexto de Diagnóstico Mapeado para Trazabilidad Completa
El Contexto de Diagnóstico Mapeado (MDC) en SLF4J resuelve el desafío de pasar información contextual a través de cadenas de llamadas. En lugar de pasar manualmente IDs de hilo en cada método, MDC asocia datos al hilo de ejecución actual.
Aspectos clave del uso de MDC:
- Identificadores de negocio — user_id, order_id, transaction_id
- Contexto técnico — traceId, spanId para trazas
- Metadatos de punto de entrada — tipo de entrypoint, número de intento de reintento
- Limpieza automática — siempre limpiar el contexto tras procesar la solicitud
MDC brilla en los puntos de entrada, donde los IDs de negocio deben estar disponibles desde el inicio, a menudo extraídos de cabeceras antes de leer el payload.
Puntos de Entrada y su Registro
Un punto de entrada (EP) es la abstracción para iniciar la ejecución de lógica de negocio. Tipos comunes en apps modernas:
- Servidores HTTP/REST
- Servidores gRPC
- Consumidores Kafka
- Tareas programadas y cron jobs
- Escuchadores de colas de mensajes
Cada EP debe seguir un esquema de registro consistente:
- Entradas — metadatos de solicitud y payload
- Contexto de ejecución — IDs de negocio, parámetros técnicos
- Salidas — resultado del procesamiento o error
- Estado — éxito/fallo considerando reintentos
Separación de Errores y Advertencias en Sistemas Distribuidos
Los reintentos son estándar para la fiabilidad en sistemas distribuidos y moldean directamente la estrategia de registro:
Usar nivel WARN para:
- Errores en intentos intermedios de reintento
- Fallos transitorios solucionables por reintento
- Problemas que no requieren atención inmediata del operador
Reservar nivel ERROR para:
- Intentos finales fallidos
- Errores críticos que hacen inútiles más reintentos
- Situaciones que exigen intervención inmediata
Numerar reintentos de mayor a menor (ej. 2 → 1 → 0), donde 0 es el último intento. Esto facilita filtrar errores finales.
Implementación Práctica con Interceptores
Los frameworks modernos ofrecen interceptores para preocupaciones transversales. Flujo de registro en puntos de entrada vía interceptores:
- Inicialización de contexto — establecer traceId, spanId en MDC
- Registro de entrada — capturar metadatos e inputs
- Procesar solicitud — ejecutar lógica de negocio con propagación automática de MDC
- Registro de salida — registrar resultado o error
- Limpieza de contexto — borrar todos los datos de MDC
Piezas clave de implementación:
- Interceptores de entrada/salida por tipo de EP
- Integración de trazas (Jaeger, Zipkin)
- Extracción automática de IDs de negocio de cabeceras
- Serialización consistente de logs en JSON
Campos Obligatorios en Registros Estructurados
Para consistencia y análisis fácil, cada log debe incluir:
- Campos técnicos centrales
- timestamp en formato ISO-8601
- nivel de log (ERROR, WARN, INFO, DEBUG)
- nombre y versión del servicio
- ID de instancia de la app
- Contexto de ejecución
- traceId y spanId para correlación de solicitudes
- requestId
- tipo y nombre de entrypoint
- conteo de reintentos
- Contexto de negocio
- IDs clave de negocio (user_id, order_id, etc.)
- metadatos de solicitud (método HTTP, endpoint, grupo de consumidores)
- entorno (stage, región, clúster)
- Datos del evento
- mensaje legible por humanos
- detalles estructurados del evento
- stacktrace de error (para ERROR)
- duración (para logs de EP)
Integración con el Ecosistema de Observabilidad
Los logs estructurados no funcionan aislados: forman parte de una observabilidad completa:
Correlación con métricas:
- IDs compartidos entre logs y métricas
- Vincular logs de error a métricas de tasa de error
- Usar logs para contextualizar anomalías métricas
Integración con trazas:
- traceId/spanId unificado entre logs y trazas
- Enriquecer trazas con detalles de logs
- Depurar spans específicos vía logs
Procesamiento automatizado:
- Alertas basadas en patrones de logs
- Hooks para sistemas de gestión de incidentes
- Extracción automática de datos para recuperación
Lecciones Clave
- Los logs estructurados en JSON proporcionan un formato legible por máquinas para un procesamiento y análisis automatizado fluido.
- El contexto MDC propaga IDs de negocio a través de cadenas de llamadas sin cambiar firmas de métodos.
- La separación clara error/warn soporta lógica de reintentos y reduce ruido en monitoreo.
- Un esquema unificado de logging en EP garantiza consistencia para análisis de transacciones distribuidas.
- Un conjunto estándar de campos habilita correlación de eventos y búsqueda eficiente.
— Editorial Team
Aún no hay comentarios.