""" Configuración de logging para AR-ShipDesign. Logs rotativos en %APPDATA%/ARShipDesign/logs/ """ import logging import os from logging.handlers import RotatingFileHandler from pathlib import Path def get_log_dir() -> Path: """Retorna el directorio de logs en %APPDATA%.""" appdata = os.environ.get("APPDATA", Path.home() / "AppData" / "Roaming") log_dir = Path(appdata) / "ARShipDesign" / "logs" log_dir.mkdir(parents=True, exist_ok=True) return log_dir def setup_logging(level: str = "INFO") -> logging.Logger: """ Configura el sistema de logging de la aplicación. Parameters ---------- level : str Nivel de logging: DEBUG, INFO, WARNING, ERROR Returns ------- logging.Logger Logger raíz de la aplicación. """ numeric_level = getattr(logging, level.upper(), logging.INFO) log_file = get_log_dir() / "arshipdesign.log" formatter = logging.Formatter( fmt="%(asctime)s [%(levelname)-8s] %(name)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) # Handler de archivo rotativo (5 MB × 3 archivos) file_handler = RotatingFileHandler( log_file, maxBytes=5 * 1024 * 1024, backupCount=3, encoding="utf-8" ) file_handler.setFormatter(formatter) file_handler.setLevel(numeric_level) # Handler de consola console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(numeric_level) root_logger = logging.getLogger("arshipdesign") root_logger.setLevel(numeric_level) root_logger.addHandler(file_handler) root_logger.addHandler(console_handler) root_logger.info("AR-ShipDesign logging iniciado — nivel: %s", level) return root_logger def get_logger(name: str) -> logging.Logger: """Retorna un logger hijo del logger raíz de la app.""" return logging.getLogger(f"arshipdesign.{name}")