如何在Python logging模块中为双处理器指定级别并过滤日志
如何让Stream Handler仅记录INFO级别日志?
这问题我之前配置日志的时候也踩过坑!核心原因是Python logging模块的setLevel()是「过滤掉低于该级别的日志」,而非仅保留该级别——所以你给Stream Handler设logging.INFO,它会把INFO、WARNING、ERROR、CRITICAL这些≥INFO级别的日志全记录下来,这就导致了不符合预期的输出。
要实现「仅记录INFO级别」的需求,我们需要用**日志过滤器(logging.Filter)**来做精准过滤。
具体实现步骤
1. 自定义一个仅允许INFO级别的过滤器
先写一个过滤器类,只有当日志级别恰好是INFO时,才允许它通过:
import logging class InfoOnlyFilter(logging.Filter): def filter(self, record): # 仅保留级别等于INFO的日志记录 return record.levelno == logging.INFO
2. 给Stream Handler绑定这个过滤器
修改你原有的代码,给stream_handler添加这个过滤器:
# 创建自定义Logger logger = logging.getLogger('DBMQ') logger.setLevel(logging.DEBUG) # 配置控制台Stream Handler stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.INFO) # 关键:添加自定义过滤器,限制仅INFO级别通过 stream_handler.addFilter(InfoOnlyFilter()) logger.addHandler(stream_handler) # 配置文件File Handler file_handler = logging.FileHandler('./data/file.log') file_handler.setLevel(logging.WARNING) logger.addHandler(file_handler)
测试验证
现在再运行你的测试用例,就能得到期望的效果:
logger.debug('hey'):无任何输出(符合预期)logger.info('hey'):仅控制台Stream Handler记录该消息(符合预期)logger.warning('hey'):仅文件File Handler记录该消息(控制台不再输出)logger.error('hey'):仅文件File Handler记录该消息(符合预期)logger.critical('hey'):仅文件File Handler记录该消息(符合预期)
额外小技巧
如果之后需要调整过滤规则(比如同时允许INFO和DEBUG),只需要修改过滤器的filter方法即可:
class InfoAndDebugFilter(logging.Filter): def filter(self, record): return record.levelno in (logging.DEBUG, logging.INFO)
内容的提问来源于stack exchange,提问作者Sadra




