设置Python logging字典配置时incremental=True报错排查
日志配置加载报错分析与解决
问题场景
准备了两个日志配置文件:
cfg1.yaml
version: 1 incremental: False formatters: text_fmt: format: "%(asctime)s - %(levelname)s - job_id %(job_id)s - task_id %(task_id)s - username %(username)s - %(message)s" handlers: text_file: class: logging.FileHandler formatter: text_fmt filename: job_log.txt loggers: logger: level: INFO handlers: [text_file]
cfg2.yaml(与cfg1仅将"text"替换为"txt")
version: 1 incremental: True formatters: txt_fmt: format: "%(asctime)s - %(levelname)s - job_id %(job_id)s - task_id %(task_id)s - username %(username)s - %(message)s" handlers: txt_file: class: logging.FileHandler formatter: txt_fmt filename: job_log.txt loggers: logger: level: INFO handlers: [txt_file]
加载配置的代码:
import yaml from logging import config fh = open("./cfg1.yaml") log_config = yaml.safe_load(fh.read()) config.dictConfig(log_config) fh = open("./cfg2.yaml") log_config = yaml.safe_load(fh.read()) config.dictConfig(log_config)
运行时出现报错:
Traceback (most recent call last): File "/Users/schapman/Workspaces/obs-demo-job-doer/converter.py", line 10, in <module> config.dictConfig(log_config) File "/Users/schapman/.pyenv/versions/3.9.18/lib/python3.9/logging/config.py", line 809, in dictConfig dictConfigClass(config).configure() File "/Users/schapman/.pyenv/versions/3.9.18/lib/python3.9/logging/config.py", line 508, in configure raise ValueError('No handler found with ' ValueError: No handler found with name 'text_file'
注释掉cfg2.yaml中的incremental配置项即可正常运行,询问问题出在哪里。
问题原因
核心问题出在incremental: True的作用机制:
- 当
incremental设为True时,logging.config.dictConfig会增量更新现有日志配置,而非完全替换。 - 第一次加载cfg1后,
logger已经关联了名为text_file的handler;第二次加载cfg2时,因为是增量模式,logger的配置会和现有配置合并,原有的text_file引用不会被移除,而cfg2中只定义了txt_file,没有text_file,所以会报错找不到这个handler。
解决办法
有两种可行的处理方式:
- 方案一:取消增量更新:将cfg2.yaml中的
incremental: True改为incremental: False,或者直接删除该配置项(默认值就是False)。这样每次加载配置都会完全替换现有配置,不会保留之前的handler引用。 - 方案二:增量更新时保留必要引用:如果确实需要增量更新,要确保cfg2中包含所有被logger引用的handler(比如同时保留
text_file和txt_file的定义),或者先通过代码修改logger的handlers列表移除旧的handler,再加载cfg2。但这种方式复杂度较高,一般推荐第一种方案。
内容的提问来源于stack exchange,提问作者RedBullet
相关产品推荐
相关产品推荐

