Coverage for src / utils / logger.py: 100%
22 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 20:29 +0800
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-13 20:29 +0800
1"""日志模块.
3基于 Rich 的彩色终端输出和文件日志支持。
4"""
6import logging
7from pathlib import Path
9from rich.console import Console
10from rich.logging import RichHandler
13def get_logger(
14 name: str,
15 level: str = "INFO",
16 log_file: str | None = None,
17 console_output: bool = True,
18) -> logging.Logger:
19 """获取配置好的日志记录器.
21 Args:
22 name: 日志记录器名称
23 level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
24 log_file: 日志文件路径(可选)
25 console_output: 是否输出到终端
27 Returns:
28 配置好的 Logger 实例
30 Example:
31 >>> logger = get_logger(__name__)
32 >>> logger.info("Hello, World!")
33 """
34 logger = logging.getLogger(name)
35 logger.setLevel(getattr(logging, level.upper()))
37 # 清除已有处理器
38 logger.handlers = []
40 # 终端处理器(Rich)
41 if console_output:
42 console_handler = RichHandler(
43 console=Console(stderr=True),
44 show_time=True,
45 show_path=True,
46 rich_tracebacks=True,
47 markup=True,
48 )
49 console_handler.setLevel(getattr(logging, level.upper()))
50 console_handler.setFormatter(logging.Formatter("%(message)s", datefmt="[%X]"))
51 logger.addHandler(console_handler)
53 # 文件处理器
54 if log_file:
55 log_path = Path(log_file)
56 log_path.parent.mkdir(parents=True, exist_ok=True)
58 file_handler = logging.FileHandler(log_file, encoding="utf-8")
59 file_handler.setLevel(logging.DEBUG)
60 file_formatter = logging.Formatter(
61 "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
62 datefmt="%Y-%m-%d %H:%M:%S",
63 )
64 file_handler.setFormatter(file_formatter)
65 logger.addHandler(file_handler)
67 return logger