Python中是否可以抑制INFO级别的日志输出?
特定INFO级别日志通用抑制方案
warnings模块仅用于拦截Python原生Warning类的告警输出,无法处理走标准logging模块打印的INFO级日志属于正常表现,特定内容的INFO日志屏蔽完全可实现,以下是不依赖特定第三方库配置的通用实现方法:
方法1:为日志器添加自定义过滤器(推荐)
这是侵入性最低、规则最灵活的标准方案,原理是在日志输出链路中增加校验逻辑,命中屏蔽规则的日志会被直接拦截,不会输出到控制台或文件。
import logging class TargetLogFilter(logging.Filter): def filter(self, record): # 填入需要屏蔽的日志核心关键词 block_content = "Using categorical units to plot a list of strings that are all parsable as floats or dates" # 仅拦截INFO级别、命中关键词的日志,其余日志正常放行 if record.levelno == logging.INFO and block_content in record.getMessage(): return False return True # 挂载过滤器:如果知道日志所属的logger名(比如matplotlib的logger名是matplotlib),可以精准挂载到对应logger,避免全局影响 # 不确定logger名时可以挂载到根logger,全局生效 logger = logging.getLogger() logger.addFilter(TargetLogFilter())
该方案支持自定义任意匹配规则,既可以按日志内容匹配,也可以按日志来源模块、日志附带参数做过滤,不会误伤其他无关日志。
方法2:调整指定日志器的输出级别
如果你确认某个模块/第三方库输出的所有INFO级日志都不需要查看,可以直接将对应日志器的输出阈值调高到WARNING级别,该级别以下的所有日志都会被屏蔽。
import logging # 示例:屏蔽matplotlib模块下所有INFO及更低级别的日志 logging.getLogger("matplotlib").setLevel(logging.WARNING)
该方案实现最简单,但颗粒度较粗,会屏蔽目标logger下所有INFO日志,无法单独屏蔽某一条特定内容的日志,仅适合完全不需要对应模块INFO输出的场景。
方法3:重定向标准输出/错误流做兜底拦截
如果遇到部分库没有遵循标准logging规范,直接向标准输出、标准错误流打印INFO内容的场景,可以通过重定向IO流的方式在输出层做内容拦截。
import sys from io import StringIO class LogBlockStream(StringIO): def __init__(self, origin_stream, block_keywords): self.origin_stream = origin_stream self.block_keywords = block_keywords super().__init__() def write(self, content): # 命中屏蔽关键词的内容直接丢弃,其余内容正常输出 for kw in self.block_keywords: if kw in content: return self.origin_stream.write(content) # 替换标准输出流,如果日志是打印到标准错误则替换sys.stderr sys.stdout = LogBlockStream( sys.stdout, ["Using categorical units to plot a list of strings that are all parsable as floats or dates"] )
该方案属于兜底实现,不关心日志的打印实现逻辑,只要走系统标准IO流就能拦截,但需要注意关键词匹配要足够精准,避免误伤正常的print输出或其他日志。
实现优先级推荐:优先使用自定义logging过滤器的方案,是Python日志体系原生支持的扩展方式,无额外副作用;仅当确定不需要某模块全部INFO日志时使用级别调整方案;只有当日志不走标准logging模块时,再使用IO流重定向的兜底方案。
内容的提问来源于stack exchange,提问作者Veliko
相关产品推荐
相关产品推荐

