import logging import os from logging.handlers import RotatingFileHandler # Define paths BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # Fallback to local 'logs' dir if not overridden in Docker LOGS_DIR = os.environ.get("LOGS_DIR", os.path.join(BASE_DIR, "logs")) # Ensure directory exists os.makedirs(LOGS_DIR, exist_ok=True) LOG_FILE_PATH = os.path.join(LOGS_DIR, "backend.log") def setup_logger(): logger = logging.getLogger("ainventory") # Set to DEBUG for development; change to INFO for production log_level = os.environ.get("LOG_LEVEL", "DEBUG") logger.setLevel(getattr(logging, log_level.upper(), logging.INFO)) # Avoid duplicate handlers if setup multiple times if logger.handlers: return logger formatter = logging.Formatter( "[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) # File Handler (10MB max, keep 5 backups) try: file_handler = RotatingFileHandler( LOG_FILE_PATH, maxBytes=10*1024*1024, backupCount=5 ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # Special redirect for uvicorn logs to also go to file logging.getLogger("uvicorn").addHandler(file_handler) logging.getLogger("uvicorn.access").addHandler(file_handler) except (PermissionError, IOError) as e: logger.warning(f"⚠️ [LOGGING] Cannot write to log file at {LOG_FILE_PATH}: {e}") logger.warning("⚠️ [LOGGING] Continuing with console-only output.") # Console Handler (always registered) console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) return logger log = setup_logger()