"""统一日志工具。 Usage: from tests.utils.logger import get_logger logger = get_logger(__name__) logger.info("开始执行用例") logger.error(f"用例失败: {e}") """ import logging import sys from datetime import datetime from pathlib import Path # 日志目录 LOGS_DIR = Path("output/logs") LOGS_DIR.mkdir(parents=True, exist_ok=True) # 日志格式 _FORMAT = "%(asctime)s [%(levelname)s] %(name)s — %(message)s" _DATE_FMT = "%Y-%m-%d %H:%M:%S" # 根 logger 配置(模块级,只初始化一次) _ROOT_LOGGER = logging.getLogger("tests") _ROOT_LOGGER.setLevel(logging.DEBUG) # 控制台 Handler _console_handler = logging.StreamHandler(sys.stdout) _console_handler.setLevel(logging.INFO) _console_handler.setFormatter(logging.Formatter(_FORMAT, datefmt=_DATE_FMT)) # 文件 Handler(每次运行一个日志文件) _log_file = LOGS_DIR / f"test_run_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" _file_handler = logging.FileHandler(_log_file, encoding="utf-8") _file_handler.setLevel(logging.DEBUG) _file_handler.setFormatter(logging.Formatter(_FORMAT, datefmt=_DATE_FMT)) _ROOT_LOGGER.addHandler(_console_handler) _ROOT_LOGGER.addHandler(_file_handler) def get_logger(name: str) -> logging.Logger: """获取以 `tests.` 为前缀的子 logger。""" if not name.startswith("tests."): name = f"tests.{name}" return logging.getLogger(name)