Python Logging模块日志级别异常问题:StreamHandler无法输出Debug与Info级日志
问题修复:StreamHandler无法输出Debug/Info级日志
问题原因
你遇到的核心问题是logging模块的层级过滤机制:Python的日志系统会先通过「Logger本身的级别」过滤日志,再传递给对应的Handler做二次过滤。
默认情况下,根Logger(也就是你通过logging.getLogger()获取的顶级Logger)的级别是logging.WARNING,这意味着所有级别低于WARNING的日志(DEBUG、INFO)会直接被根Logger拦截,根本不会传递给你的StreamHandler——哪怕你给StreamHandler设置了DEBUG级别也没用。
修复方案
只需要给根Logger也设置DEBUG级别,让它允许DEBUG及以上的日志通过,这样StreamHandler才能接收到这些日志并输出到stdout。修改后的代码如下:
import logging import sys # 详细日志配置 logger = logging.getLogger() # 新增:给根Logger设置DEBUG级别,放开低级日志的传递权限 logger.setLevel(logging.DEBUG) file_handler = logging.FileHandler("logs.txt") file_handler.setLevel(logging.ERROR) stream_handler = logging.StreamHandler(stream=sys.stdout) stream_handler.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") stream_handler.setFormatter(formatter) file_handler.setFormatter(formatter) logger.addHandler(stream_handler) logger.addHandler(file_handler) # 业务代码日志输出 logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')
验证效果
修改后运行代码,控制台会输出所有级别的日志:
2021-10-30 15:32:49,033 | DEBUG | debug message 2021-10-30 15:32:49,033 | INFO | info message 2021-10-30 15:32:49,034 | WARNING | warn message 2021-10-30 15:32:49,034 | ERROR | error message 2021-10-30 15:32:49,035 | CRITICAL | critical message
而logs.txt依然只会保留ERROR及以上级别的日志,完全符合你的预期。
补充说明
记住这个核心逻辑:Logger级别是第一道关卡,Handler级别是第二道关卡。只有日志级别同时满足「≥Logger级别」和「≥Handler级别」时,才会被最终输出。如果Logger级别设置得太高,低级别的日志连Handler都到不了。
内容的提问来源于stack exchange,提问作者Data Mastery
相关产品推荐
相关产品推荐

