Saltar a contenido

📊 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.