Python日志器未继承root日志器级别 Handler设DEBUG仍仅输出WARNING
问题原因解析
核心机制:Python logging的两级过滤规则
Python的logging模块输出日志会经过两层过滤,顺序不可颠倒:
- 第一层:消息生成时的Logger实例级别校验,低于当前Logger设置的级别的日志会被直接丢弃,不会向下传递给任何Handler
- 第二层:只有通过Logger校验的日志,才会传递到绑定的Handler,再执行Handler的级别校验
你的场景问题所在
Python默认的root日志器的默认级别为WARNING,你只给Handler设置了DEBUG级别,但是第一层的root日志器只会放行WARNING及以上级别的日志,DEBUG、INFO级别的日志在第一层就被拦截,根本到不了Handler处理环节,所以最终日志文件只有WARNING及以上的内容。
当你修改为logging.root.setLevel(logging.DEBUG)后,第一层过滤放开了DEBUG及以上级别的日志,才能进入Handler的级别校验环节,功能自然恢复正常。你之前查阅的资料和实际现象不符,大概率是资料示例中已经提前修改了root日志器的级别,默认场景下不会只修改Handler级别就生效。
第三方库开发的日志最佳实践
你当前在MyClass的__init__中直接给root日志器添加Handler的做法不符合第三方库的开发规范,会直接覆盖上层应用的日志配置,正确的做法如下:
- 库代码绝对不要修改
root日志器的任何配置,包括添加Handler、修改级别 - 在库的根目录
__init__.py中仅添加空Handler,避免用户未配置日志时出现警告:
import logging logging.getLogger(__name__).addHandler(logging.NullHandler())
- 库内所有模块使用
logging.getLogger(__name__)获取对应模块的日志器打日志即可,所有日志配置权限完全交给使用库的上层应用来处理。
内容的提问来源于stack exchange,提问作者demberto
相关产品推荐
相关产品推荐

