You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动