Registro estructurado
Emita registros con formato JSON para obtener una salida legible por máquinas.
Registro estructurado es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
¿Qué es el logging estructurado?
El logging estructurado emite los registros como datos legibles por máquinas (JSON) en lugar de texto libre, lo que facilita indexarlos, buscarlos y generar alertas.
import logging, json
def log_json(level, msg, **kw):
record = {"level": level, "msg": msg, **kw}
print(json.dumps(record))
log_json("INFO", "Request received", path="/api/users", method="GET")Formatter JSON personalizado
Herede de logging.Formatter para emitir JSON en lugar de texto sin formato.
import logging, json
class JSONFormatter(logging.Formatter):
def format(self, record):
return json.dumps({
"time": self.formatTime(record),
"level": record.levelname,
"name": record.name,
"msg": record.getMessage(),
})
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)python-json-logger
El paquete python-json-logger proporciona un formatter JSON listo para usar, con campos estándar y adicionales.
# pip install python-json-logger
import logging
from pythonjsonlogger import jsonlogger
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(jsonlogger.JsonFormatter())
logger.addHandler(handler)
logger.info("User created", extra={"user_id": 42})structlog
structlog es una biblioteca de terceros popular que separa la acumulación del contexto del formateo y admite pipelines de procesadores.
# pip install structlog
import structlog
log = structlog.get_logger()
log = log.bind(request_id="abc123")
log.info("payment_processed", amount=49.99, currency="USD")Asociar contexto con structlog
structlog permite asociar pares clave-valor a un logger que los conserva en todas las llamadas posteriores.
import structlog
log = structlog.get_logger().bind(
service="auth",
env="prod"
)
log.warning("login_failed", user="alice", reason="bad_password")
# {service:auth, env:prod, user:alice, reason:bad_password}Añadir marcas de tiempo e información del llamador
Los procesadores pueden enriquecer los registros automáticamente. Añada TimeStamper y CallsiteParameterAdder a cada registro de log.
import structlog
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.CallsiteParameterAdder([structlog.processors.CallsiteParameter.FILENAME]),
structlog.processors.JSONRenderer(),
]
)Registrar IDs de solicitud en aplicaciones web
En un framework web, asocie un ID de solicitud al principio de cada solicitud para que todas las líneas de log de esa solicitud lo incluyan.
import structlog
def middleware(request, call_next):
req_id = request.headers.get("X-Request-Id", generate_id())
log = structlog.get_logger().bind(request_id=req_id)
log.info("request_started", path=request.url.path)
response = call_next(request)
log.info("request_finished", status=response.status_code)
return responseFormato de log ECS
Elastic Common Schema (ECS) es un formato estándar de logs JSON utilizado por Elastic Stack. Use ecs-logging para Python.
# pip install ecs-logging
import logging
import ecs_logging
logger = logging.getLogger("app")
handler = logging.StreamHandler()
handler.setFormatter(ecs_logging.StdlibFormatter())
logger.addHandler(handler)
logger.info("Event logged in ECS format")Sistemas de agregación de logs
Los logs JSON estructurados se integran de forma natural con herramientas de agregación: Elasticsearch/Kibana (ELK), Grafana Loki, Datadog y AWS CloudWatch Logs Insights.
# Loki query example:
# {app="myservice"} | json | level="ERROR"
# CloudWatch Insights:
# fields @timestamp, level, msg
# | filter level = "ERROR"
# | sort @timestamp descEvitar PII en los logs
Elimine la información de identificación personal antes de registrarla. Use un procesador o filtro personalizado para enmascarar correos electrónicos, tokens y contraseñas.
import re
def mask_pii(_, __, event_dict):
msg = event_dict.get("event", "")
event_dict["event"] = re.sub(
r"[\w.+-]+@[\w-]+\.[\w.]+", "***@***.***", msg
)
return event_dictVentajas y desventajas del logging estructurado y no estructurado
Los logs estructurados permiten buscar y generar alertas, pero son más verbosos. Combine el logging estructurado en producción con un formato legible para las personas durante el desarrollo mediante una configuración basada en el entorno.
import structlog, os
if os.getenv("ENV") == "production":
renderer = structlog.processors.JSONRenderer()
else:
renderer = structlog.dev.ConsoleRenderer()
structlog.configure(processors=[renderer])Comprobación rápida
¿Cuál es la principal ventaja de los logs estructurados en JSON frente a los logs de texto sin formato?
Resumen
El logging estructurado emite registros JSON de tipo clave-valor. Use un JSONFormatter, python-json-logger o structlog. Asocie el contexto (ID de solicitud, usuario) al principio de una operación para que todas las líneas de log de esa operación lo conserven.
Preguntas frecuentes
¿La lección «Registro estructurado» es gratis?
Sí — el texto completo de «Registro estructurado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Registro estructurado»?
Emita registros con formato JSON para obtener una salida legible por máquinas. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Registro estructurado»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos básicos del módulo logging
- Handlers, formatters y filtros
- Registro estructurado
- Depuración con pdb