Python logging如何为不同日志级别配置不同处理器 避免日志重复
实现方案
你不需要修改任何模块里logger = logging.getLogger(__name__)的现有代码,只需要在程序启动入口处统一配置根日志器即可,核心是给根日志器绑定两个独立的日志处理器,分别设置不同的过滤级别,从根源避免重复输出问题。
可直接复用的配置代码
把这段代码放在程序最开始运行的位置(比如入口文件的顶部、启动函数的最前面)即可:
import logging import sys # 获取根日志器,全局最低日志级别设为DEBUG,否则DEBUG日志会被提前丢弃 root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) # 配置文件处理器:写入所有DEBUG及以上级别的日志到指定文件 file_handler = logging.FileHandler("app.log", encoding="utf-8") file_handler.setLevel(logging.DEBUG) file_handler.setFormatter( logging.Formatter("%(asctime)s - %(module)s - %(levelname)s - %(message)s") ) # 配置stderr流处理器:仅将INFO及以上级别的日志输出到标准错误 stderr_handler = logging.StreamHandler(sys.stderr) stderr_handler.setLevel(logging.INFO) stderr_handler.setFormatter( logging.Formatter("%(levelname)s: %(message)s") ) # 将两个处理器挂载到根日志器 root_logger.addHandler(file_handler) root_logger.addHandler(stderr_handler)
为什么能解决你遇到的问题
- 不需要改动业务模块代码:所有通过
getLogger(__name__)获取的子日志器默认都会继承根日志器配置,日志事件会自动向上传递给根日志器的处理器处理,不需要给每个子日志器单独做配置。 - 不会出现日志重复输出:只要你不给子日志器单独绑定额外的处理器,所有日志只会被根日志器的两个处理器按各自规则处理一次,不会重复打印。你之前遇到重复输出的问题,本质是误给子日志器也绑定了处理器,日志同时被子日志器处理器和根日志器处理器各处理了一次。
注意事项
- 根日志器的级别必须设为
DEBUG:如果根日志器级别设置为INFO,DEBUG级别的日志在传递到根日志器层就会被全局过滤,根本到不了文件处理器,无法实现全量日志落盘。 - 两个处理器的级别是独立判定的:文件处理器设DEBUG就会接收全量日志,stderr处理器设INFO就会自动过滤掉DEBUG级日志,二者互不干扰。
- 不要随意修改子日志器的
propagate属性:默认值True是日志向上传递的开关,只要不给子日志器单独绑定处理器,保持默认值完全不会触发重复问题。
内容的提问来源于stack exchange,提问作者tensojka
相关产品推荐
相关产品推荐

