📊 Estrategia de Logging
Una estrategia de logging robusta es fundamental para la observabilidad del P2P Dashboard. Permite rastrear el flujo de ejecución de la aplicación, diagnosticar problemas, monitorear el rendimiento y auditar las operaciones. En este proyecto, se utiliza el módulo logging de Python, configurado para proporcionar logs estructurados y útiles.
Configuración del Logging (logging_config.py)
La configuración del sistema de logging se centraliza en el archivo p2p_api/logging_config.py. Esto asegura una configuración consistente en toda la aplicación.
# p2p_api/logging_config.py
import logging
from logging.handlers import RotatingFileHandler
import os
def setup_logging():
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
# Configuración del logger principal
logger = logging.getLogger("p2p_api")
logger.setLevel(logging.INFO) # Nivel de logging por defecto
# Formato del log
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
# Handler para consola
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# Handler para archivo con rotación
log_file = os.path.join(log_dir, "p2p_api.log")
file_handler = RotatingFileHandler(
log_file, maxBytes=10*1024*1024, backupCount=5 # 10 MB, 5 archivos de backup
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Configuración para loggers de librerías externas (opcional)
logging.getLogger("uvicorn").setLevel(logging.WARNING)
logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING)
# Llamar a setup_logging() al inicio de la aplicación (ej. en main.py)
# if __name__ == "__main__":
# setup_logging()
# logger = logging.getLogger("p2p_api")
# logger.info("Logging configurado correctamente.")
Niveles de Logging
Se utilizan los niveles de logging estándar de Python para categorizar los mensajes:
DEBUG: Información detallada, típicamente de interés solo cuando se diagnostican problemas.INFO: Confirmación de que las cosas están funcionando como se esperaba.WARNING: Una indicación de que algo inesperado ha ocurrido, o indicativo de algún problema en un futuro cercano (ej. 'espacio en disco bajo'). El software sigue funcionando como se esperaba.ERROR: Debido a un problema más serio, el software no ha podido realizar alguna función.CRITICAL: Un error grave, indicando que el programa en sí mismo puede no ser capaz de continuar ejecutándose.
Uso Consistente del Logger
Es crucial utilizar el logger de forma consistente en toda la aplicación. Se recomienda obtener el logger por nombre de módulo para facilitar la identificación del origen del mensaje.
# p2p_api/services.py (ejemplo)
import logging
logger = logging.getLogger(__name__)
def process_offers(offers: list):
try:
logger.info(f"Iniciando procesamiento de {len(offers)} ofertas.")
# ... lógica de procesamiento ...
logger.debug("Ofertas procesadas con éxito.")
return True
except Exception as e:
logger.exception(f"Error al procesar ofertas: {e}") # Registra la traza completa
return False
Beneficios de una Buena Estrategia de Logging
- Diagnóstico de Problemas: Los logs proporcionan un rastro de eventos que ayuda a identificar la causa raíz de los errores.
- Monitoreo de Rendimiento: Se pueden registrar métricas clave (ej. tiempo de procesamiento de solicitudes, número de ofertas ingestas) para evaluar el rendimiento del sistema.
- Auditoría: Los logs detallados permiten auditar las operaciones, especialmente en la Capa de Ingesta, para verificar la trazabilidad de los datos.
- Alertas: Los logs pueden ser integrados con sistemas de monitoreo externos para generar alertas automáticas ante eventos críticos.
Una estrategia de logging bien implementada es una herramienta invaluable para mantener la salud y la estabilidad del P2P Dashboard.