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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:06:33