Python logging模块:如何仅捕获指定单一级别日志?
Python 仅捕获DEBUG级别日志的实现方法
完全可以实现只捕获DEBUG级别的日志,核心是通过自定义日志过滤器精确控制。以下是可直接运行的实现方案:
自定义特定级别过滤器
先写一个过滤器类,只允许指定级别的日志通过:
import logging class SpecificLevelFilter(logging.Filter): def __init__(self, target_level): self.target_level = target_level self.target_level_name = logging.getLevelName(target_level) def filter(self, record): # 仅保留与目标级别完全匹配的日志 return record.levelname == self.target_level_name
配置日志并测试
把过滤器绑定到日志处理器上,同时注意日志器的级别设置:
# 创建日志实例 logger = logging.getLogger("debug_only") # 日志器级别必须设为DEBUG,确保DEBUG日志能传递到处理器 logger.setLevel(logging.DEBUG) # 创建控制台输出处理器 handler = logging.StreamHandler() # 给处理器添加过滤器,指定只保留DEBUG级别 handler.addFilter(SpecificLevelFilter(logging.DEBUG)) # 将处理器添加到日志器 logger.addHandler(handler) # 测试不同级别日志 logger.debug("这条DEBUG日志会被输出") logger.info("这条INFO日志会被过滤") logger.warning("这条WARNING日志会被过滤") logger.error("这条ERROR日志会被过滤") logger.critical("这条CRITICAL日志会被过滤")
关键注意事项
- 日志器的
setLevel必须设为DEBUG或更低:如果设成INFO及以上,DEBUG级别的日志会被日志器直接拦截,根本到不了处理器的过滤器。 - 过滤器判断逻辑:用
levelname匹配比直接用数字levelno更稳妥,避免自定义级别导致的数字冲突;如果只用标准日志级别,也可以改成return record.levelno == self.target_level。
内容的提问来源于stack exchange,提问作者NumeroUnoDE
相关产品推荐
相关产品推荐

