ADR 0032 — Use JSON Structured Logging
Status
Accepted
Context
Los servicios Python actualmente usan el módulo logging con formato de texto plano. Esto dificulta:
- Parseo automático de logs
- Correlación de requests entre servicios
- Agregación en sistemas como Loki o Elasticsearch
- Análisis y búsqueda de campos específicos
Decision
Todos los servicios Python emitirán logs en formato JSON estructurado usando python-json-logger.
Campos estándar:
timestamp: ISO 8601level: DEBUG/INFO/WARNING/ERRORmessage: Mensaje del logservice: Nombre del serviciocorrelation_id: ID de request para trazabilidadextra: Campos adicionales según contexto
Consequences
- Pros:
- Logs parseables automáticamente por Loki/ELK.
- Correlación entre servicios mediante
correlation_id. - Campos estructurados permiten queries precisas.
- Compatible con estándar OpenTelemetry logging.
- Cons / Trade-offs:
- Logs menos legibles directamente en terminal (mitigation: usar
jq). - Requiere configuración adicional vs logging por defecto.
- Verbosidad incrementada en bytes.
- Logs menos legibles directamente en terminal (mitigation: usar
Alternatives considered
- Loguru: Popular, pero introduce dependencia no estándar.
- structlog: Muy potente, pero curva de aprendizaje mayor.
- OpenTelemetry Logging: Aún inmaduro comparado con tracing/metrics.
Implementation
# logging_config.py
import logging
from pythonjsonlogger import jsonlogger
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter(
'%(timestamp)s %(level)s %(name)s %(message)s'
)
handler.setFormatter(formatter)
logging.root.addHandler(handler)
References
- https://github.com/madzak/python-json-logger
- https://www.structlog.org/
- https://opentelemetry.io/docs/specs/otel/logs/