Volver al inicio

Registros JSON Estructurados: Una Guía para Desarrolladores

El artículo proporciona una guía práctica para implementar registro efectivo en sistemas distribuidos. Cubre registros estructurados en formato JSON, usando contexto MDC para pasar identificadores de negocio, separación adecuada de niveles de error y advertencia, así como un esquema unificado de registro de puntos de entrada (entrypoints).

Cómo Escribir Registros Correctamente: Una Guía Completa para Desarrolladores
Advertisement 728x90

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:

Google AdInline article slot
  • 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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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

Advertisement 728x90

Leer después