Python logging按级别拆分日志文件自定义Filter配置报错如何解决
问题核心原因
报错本质是两个常见问题:Python模块搜索路径未包含src目录,或YAML过滤器配置格式错误,按以下步骤修改即可:
第一步:提前将src加入Python模块搜索路径
在调用logging.config.dictConfig加载YAML配置前,先把项目根目录和src目录加入sys.path,否则Python无法识别src.logger模块,参考代码:
import sys from pathlib import Path import yaml import logging.config # 自行调整路径层级,确保PROJECT_ROOT是src和resources文件夹的父目录 PROJECT_ROOT = Path(__file__).parent.parent sys.path.append(str(PROJECT_ROOT)) sys.path.append(str(PROJECT_ROOT / "src")) # 路径配置完成后再加载日志配置 with open(PROJECT_ROOT / "resources" / "log.yaml", "r", encoding="utf-8") as f: log_config = yaml.safe_load(f) logging.config.dictConfig(log_config)
第二步:正确编写YAML过滤器配置
不需要加ext://前缀,用()特殊键标识自定义类即可,完整配置片段参考:
version: 1 disable_existing_loggers: False # 过滤器配置段 filters: info_filter: '()': src.logger.InfoFilter warning_filter: '()': src.logger.WarningFilter error_filter: '()': src.logger.ErrorFilter critical_filter: '()': src.logger.CriticalFilter # handler关联过滤器示例 handlers: info_file: class: logging.handlers.RotatingFileHandler level: INFO filters: [info_filter] filename: logs/info.log maxBytes: 10485760 backupCount: 10 encoding: utf-8 formatter: standard warning_file: class: logging.handlers.RotatingFileHandler level: WARNING filters: [warning_filter] filename: logs/warning.log maxBytes: 10485760 backupCount: 10 encoding: utf-8 formatter: standard # 其余handler、formatter、root配置按原有逻辑正常编写即可
第三步:确认自定义过滤器类写法合规
src/logger.py中的过滤器必须继承logging.Filter,且定义在模块顶层,不要写在if __name__ == "__main__"块中,参考写法:
import logging class InfoFilter(logging.Filter): def filter(self, record): return record.levelno == logging.INFO class WarningFilter(logging.Filter): def filter(self, record): return record.levelno == logging.WARNING class ErrorFilter(logging.Filter): def filter(self, record): return record.levelno == logging.ERROR class CriticalFilter(logging.Filter): def filter(self, record): return record.levelno == logging.CRITICAL
排查校验
如果仍报错,可在加载日志配置前先执行import src.logger,如果导包报错优先解决路径问题,再加载日志配置即可。
内容的提问来源于stack exchange,提问作者MinionAttack
相关产品推荐
相关产品推荐

