import logging import os from logging.handlers import RotatingFileHandler from typing import Optional def configure_logging(log_level: Optional[str], log_file: Optional[str]) -> None: level_name = (log_level or "INFO").upper() level = getattr(logging, level_name, logging.INFO) handlers: list[logging.Handler] = [] stream_handler = logging.StreamHandler() handlers.append(stream_handler) if log_file: log_path = log_file if not os.path.isabs(log_path): log_path = os.path.join(os.getcwd(), log_path) os.makedirs(os.path.dirname(log_path), exist_ok=True) file_handler = RotatingFileHandler( log_path, maxBytes=2_000_000, backupCount=3, encoding="utf-8" ) handlers.append(file_handler) formatter = logging.Formatter( fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) for handler in handlers: handler.setFormatter(formatter) root = logging.getLogger() for handler in list(root.handlers): root.removeHandler(handler) for handler in handlers: root.addHandler(handler) root.setLevel(level) logging.getLogger("uvicorn").setLevel(level) logging.getLogger("uvicorn.error").setLevel(level) logging.getLogger("uvicorn.access").setLevel(level)