82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""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)
|