"""Configuración centralizada de logging para el proyecto. Provee `configure_logging(verbose: bool = False)` que crea una carpeta `logs/` y subcarpetas por tipo de módulo (infra, usecases, cli) y añade handlers rotativos para cada tipo. También deja un handler de consola. """ from __future__ import annotations import logging import logging.handlers import os from typing import Optional def _ensure_dir(path: str) -> None: try: os.makedirs(path, exist_ok=True) except Exception: # si no podemos crear logs no rompemos la ejecución pass def configure_logging(verbose: bool = False, base_logs_dir: Optional[str] = None) -> None: """Configura logging del proyecto. Args: verbose: si True activa nivel DEBUG, sino INFO. base_logs_dir: directorio raíz para logs (por defecto ./logs). """ level = logging.DEBUG if verbose else logging.INFO if base_logs_dir is None: base_logs_dir = os.path.join(os.getcwd(), "logs") infra_dir = os.path.join(base_logs_dir, "infra") usecases_dir = os.path.join(base_logs_dir, "usecases") cli_dir = os.path.join(base_logs_dir, "cli") _ensure_dir(infra_dir) _ensure_dir(usecases_dir) _ensure_dir(cli_dir) # Formato simple fmt = logging.Formatter("%(asctime)s %(levelname)s [%(name)s] %(message)s") # Console handler (root) console = logging.StreamHandler() console.setLevel(level) console.setFormatter(fmt) # File handlers rotativos por tipo infra_fh = logging.handlers.RotatingFileHandler( os.path.join(infra_dir, "infra.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) infra_fh.setLevel(logging.DEBUG) infra_fh.setFormatter(fmt) usecases_fh = logging.handlers.RotatingFileHandler( os.path.join(usecases_dir, "usecases.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) usecases_fh.setLevel(logging.DEBUG) usecases_fh.setFormatter(fmt) cli_fh = logging.handlers.RotatingFileHandler( os.path.join(cli_dir, "cli.log"), maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) cli_fh.setLevel(logging.DEBUG) cli_fh.setFormatter(fmt) root = logging.getLogger() # limpiar handlers previos para evitar duplicados si se llama varias veces for h in list(root.handlers): root.removeHandler(h) root.setLevel(level) root.addHandler(console) # Asignar handlers a sub-loggers por prefijo logging.getLogger("whisper_project.infra").addHandler(infra_fh) logging.getLogger("whisper_project.usecases").addHandler(usecases_fh) logging.getLogger("whisper_project.cli").addHandler(cli_fh)