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

如何让Python非根Logger记录所有日志且不委托至父级?

如何让非根Python Logger记录所有日志且不委托至父级

根据你提到的logging.Logger.setLevel文档逻辑,非根Logger设为NOTSET时会自动委托父级(最终到默认级别为WARNING的根Logger),这就是低级别日志被过滤的原因。要实现你的需求,只需两步操作:

1. 明确设置Logger级别为最低级

不要用NOTSET,直接把非根Logger的级别设为logging.DEBUG——这是Python日志系统中最低的级别,能捕获所有严重级别的日志消息。

2. 关闭父级委托机制

将Logger的propagate属性设为False,这样该Logger的日志就不会向上传递给父级(包括根Logger),完全独立处理自己的日志。

完整代码示例

import logging

# 创建自定义非根Logger
custom_logger = logging.getLogger("my_app.logger")

# 设置级别为DEBUG,确保捕获所有日志
custom_logger.setLevel(logging.DEBUG)
# 关闭父级委托,避免受根Logger设置影响
custom_logger.propagate = False

# 为Logger添加处理器(必须自己加,否则日志不会输出)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)  # 处理器级别也要设为DEBUG,避免过滤
log_formatter = logging.Formatter("%(levelname)s [%(name)s]: %(message)s")
console_handler.setFormatter(log_formatter)
custom_logger.addHandler(console_handler)

# 测试所有级别日志
custom_logger.debug("调试信息")
custom_logger.info("普通信息")
custom_logger.warning("警告信息")
custom_logger.error("错误信息")
custom_logger.critical("严重错误信息")

关键说明

  • 为什么不用NOTSET?因为非根Logger的NOTSET会触发委托逻辑,最终沿用根Logger的WARNING级别,导致DEBUG/INFO级别的日志被过滤。
  • 为什么要加处理器?关闭propagate后,日志不会传递给根Logger的处理器,必须给自定义Logger添加自己的处理器(比如控制台输出、文件输出)才能看到日志内容。

内容的提问来源于stack exchange,提问作者Mad Physicist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27