You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:30:00