如何动态修改Python指定模块的日志级别且不丢失对应日志内容
解决方案
实现思路
你可以通过给指定模块的logger添加自定义过滤器的方式,动态修改符合条件的日志级别,既不会丢失日志,也不会影响模块其他日志的正常输出。
代码实现
首先定义自定义日志过滤器:
import logging class LevelRewriteFilter(logging.Filter): def filter(self, record): # 匹配aiokafka模块输出的ERROR级别日志 if record.name.startswith("aiokafka") and record.levelno == logging.ERROR: # 将日志级别重写为WARNING record.levelno = logging.WARNING record.levelname = "WARNING" # 返回True保留日志,返回False则丢弃该日志 return True
然后将过滤器挂载到aiokafka的logger实例上:
# 获取aiokafka对应的logger对象 aiokafka_logger = logging.getLogger("aiokafka") # 添加自定义过滤器 aiokafka_logger.addFilter(LevelRewriteFilter()) # 确保logger的最低级别设置不低于WARNING,避免重写后的日志被过滤 aiokafka_logger.setLevel(logging.WARNING)
优化方案(可选)
如果不需要修改aiokafka的所有ERROR级日志,只需要修改连接故障相关的特定日志,可以在过滤器中增加日志内容匹配规则,进一步缩小生效范围:
class LevelRewriteFilter(logging.Filter): def filter(self, record): if (record.name.startswith("aiokafka") and record.levelno == logging.ERROR # 匹配日志内容中的特定关键词,可根据实际日志内容调整 and "连接" in str(record.msg) and "故障" in str(record.msg)): record.levelno = logging.WARNING record.levelname = "WARNING" return True
注意事项
如果你的日志处理器(Handler)单独设置了级别阈值,需要确保处理器的级别低于等于WARNING,否则重写后的WARNING日志会被处理器拦截丢弃。
内容的提问来源于stack exchange,提问作者Chris Maes
相关产品推荐
相关产品推荐

