创建并配置一个日志记录器,INFO级别使用简化格式。 参数: - name: 日志记录器的名称 - level: 日志级别 - info_fmt: INFO级别的日志格式字符串 - default_fmt: 其他级别的日志格式字符串 - datefmt: 时间格式字符串 - log_file: 日志文件路径
(
name: str,
level: int = LOG_LEVEL,
info_fmt: str = "%(message)s", # INFO级别使用简化格式
default_fmt: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", # 其他级别使用详细格式
datefmt: str = "%Y-%m-%d %H:%M:%S",
log_file: str = str(LOG_PATH / "app.log"),
console_output: bool = True,
)
| 6 | |
| 7 | |
| 8 | def setup_logger( |
| 9 | name: str, |
| 10 | level: int = LOG_LEVEL, |
| 11 | info_fmt: str = "%(message)s", # INFO级别使用简化格式 |
| 12 | default_fmt: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", # 其他级别使用详细格式 |
| 13 | datefmt: str = "%Y-%m-%d %H:%M:%S", |
| 14 | log_file: str = str(LOG_PATH / "app.log"), |
| 15 | console_output: bool = True, |
| 16 | ) -> logging.Logger: |
| 17 | """ |
| 18 | 创建并配置一个日志记录器,INFO级别使用简化格式。 |
| 19 | |
| 20 | 参数: |
| 21 | - name: 日志记录器的名称 |
| 22 | - level: 日志级别 |
| 23 | - info_fmt: INFO级别的日志格式字符串 |
| 24 | - default_fmt: 其他级别的日志格式字符串 |
| 25 | - datefmt: 时间格式字符串 |
| 26 | - log_file: 日志文件路径 |
| 27 | """ |
| 28 | |
| 29 | logger = logging.getLogger(name) |
| 30 | logger.setLevel(level) |
| 31 | |
| 32 | if not logger.handlers: |
| 33 | class LevelSpecificFormatter(logging.Formatter): |
| 34 | """Thread-safe formatter that uses different formats per log level.""" |
| 35 | def format(self, record): |
| 36 | # Use local variable instead of mutating shared _style._fmt |
| 37 | fmt = info_fmt if record.levelno == logging.INFO else default_fmt |
| 38 | formatter = logging.Formatter(fmt, datefmt=datefmt) |
| 39 | return formatter.format(record) |
| 40 | |
| 41 | level_formatter = LevelSpecificFormatter(default_fmt, datefmt=datefmt) |
| 42 | |
| 43 | # 只在console_output为True时添加控制台处理器 |
| 44 | if console_output: |
| 45 | console_handler = logging.StreamHandler() |
| 46 | console_handler.setLevel(level) |
| 47 | console_handler.setFormatter(level_formatter) |
| 48 | logger.addHandler(console_handler) |
| 49 | |
| 50 | # 文件处理器 |
| 51 | if log_file: |
| 52 | Path(log_file).parent.mkdir(parents=True, exist_ok=True) |
| 53 | file_handler = logging.handlers.RotatingFileHandler( |
| 54 | log_file, maxBytes=10 * 1024 * 1024, backupCount=5, encoding="utf-8" |
| 55 | ) |
| 56 | file_handler.setLevel(level) |
| 57 | file_handler.setFormatter(level_formatter) |
| 58 | logger.addHandler(file_handler) |
| 59 | |
| 60 | # 设置特定库的日志级别为ERROR以减少日志噪音 |
| 61 | error_loggers = [ |
| 62 | "urllib3", |
| 63 | "requests", |
| 64 | "openai", |
| 65 | "httpx", |
no test coverage detected