"""Centralized logger configuration for the application. Configures the 'app' logger with a rotating file handler and console handler. Importing `logger` from this module gives a configured logger instance. """ import logging import os from logging.handlers import RotatingFileHandler # Determine project base directory (app/..) base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) log_dir = os.path.join(base_dir, "logs") os.makedirs(log_dir, exist_ok=True) log_file = os.path.join(log_dir, "app.log") logger = logging.getLogger("app") # Avoid reconfiguration if imported multiple times if not logger.handlers: formatter = logging.Formatter("%(asctime)s %(levelname)s %(name)s: %(message)s") # Resolve log level from environment (default INFO) log_level_name = os.getenv("LOG_LEVEL", "INFO").upper() try: log_level = getattr(logging, log_level_name) except Exception: log_level = logging.INFO # Rotating file handler file_handler = RotatingFileHandler(log_file, maxBytes=10 * 1024 * 1024, backupCount=7, encoding="utf-8") file_handler.setFormatter(formatter) file_handler.setLevel(log_level) logger.addHandler(file_handler) # Console handler console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(log_level) logger.addHandler(console_handler) logger.setLevel(log_level) # Expose a helper to get child loggers if needed def get_logger(name: str = None): if name: return logging.getLogger(f"app.{name}") return logger