""" 后端日志配置模块。 提供统一的日志格式和两个 handler: - console: 输出到控制台(uvicorn 可见) - file: 输出到 backend/.runtime/service.log """ import logging import sys from pathlib import Path _LOG_DIR = Path(__file__).resolve().parent.parent / ".runtime" _LOG_DIR.mkdir(parents=True, exist_ok=True) _LOG_FILE = _LOG_DIR / "service.log" _FORMAT = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s" _DATE_FORMAT = "%Y-%m-%d %H:%M:%S" def setup_logging(level: int = logging.DEBUG) -> None: """配置全局日志,可重复调用(幂等)。""" root = logging.getLogger() if root.handlers: return # 已配置过 root.setLevel(level) console = logging.StreamHandler(sys.stdout) console.setLevel(logging.INFO) console.setFormatter(logging.Formatter(_FORMAT, datefmt=_DATE_FORMAT)) file_handler = logging.FileHandler(str(_LOG_FILE), mode="a", encoding="utf-8") file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter(_FORMAT, datefmt=_DATE_FORMAT)) root.addHandler(console) root.addHandler(file_handler) def get_logger(name: str) -> logging.Logger: """获取命名 logger,自动触发 setup。""" setup_logging() return logging.getLogger(name)