如何让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
相关产品推荐
相关产品推荐

