Python日志按级别互斥输出方案咨询:避免重复日志输出
这问题我之前做项目时也碰到过,明明DEBUG日志已经包含了INFO版本的所有信息,结果两条一起打出来显得特别冗余,确实头疼。给你几个实用的解决方案,按需选就行:
方案1:封装自定义日志方法(最省心)
直接写个小函数把逻辑封装起来,调用的时候传两个消息,让函数自己判断输出哪条:
import logging logger = logging.getLogger(__name__) def log_info_or_debug(info_msg, debug_msg): # 先判断当前logger是否开启了DEBUG级别 if logger.isEnabledFor(logging.DEBUG): logger.debug(debug_msg) else: logger.info(info_msg) # 用的时候就这么写 log_info_or_debug('AA', 'AABB')
这个方法最简单,零学习成本,改代码也只需要把原来的两行日志换成一行调用就行,完美避免重复输出。
方案2:自定义Formatter(进阶统一管理)
如果你的项目日志格式要求比较统一,不想每个地方都写自定义函数,可以试试自定义日志Formatter。思路是把两种消息都传递给日志记录,让Formatter根据级别选输出内容:
import logging class SmartLogFormatter(logging.Formatter): def format(self, record): # 如果是DEBUG级别,优先输出详细消息 if record.levelno == logging.DEBUG: return getattr(record, 'detailed_msg', record.getMessage()) # INFO及以上级别,输出精简消息 else: return getattr(record, 'simple_msg', record.getMessage()) # 配置你的logger handler = logging.StreamHandler() handler.setFormatter(SmartLogFormatter()) logger = logging.getLogger(__name__) logger.addHandler(handler) # 使用时通过extra传递两种消息 logger.info('AA', extra={'detailed_msg': 'AABB'}) logger.debug('AABB', extra={'simple_msg': 'AA'})
这个方法适合大型项目,能统一控制所有日志的输出逻辑,但需要额外传递extra参数,初期改代码会多花点时间。
方案3:用日志过滤器处理(适合存量代码)
如果你的项目已经有大量现有日志代码,不想逐个修改,可以试试加个日志过滤器,自动过滤掉重复的INFO日志:
import logging class DuplicateLogFilter(logging.Filter): def filter(self, record): # 逻辑:如果当前开启了DEBUG级别,且这条是INFO日志,且属于要过滤的重复项,就返回False(过滤掉) if (record.levelno == logging.INFO and logger.isEnabledFor(logging.DEBUG) and record.msg == 'AA'): # 这里可以根据实际情况调整判断条件,比如用标识前缀 return False return True # 给logger加上过滤器 logger = logging.getLogger(__name__) logger.addFilter(DuplicateLogFilter())
这个方法不用改原有日志调用,但需要你准确识别哪些INFO和DEBUG日志是成对的,要是成对日志很多,维护过滤器的判断条件会有点麻烦,适合小范围的重复场景。
内容的提问来源于stack exchange,提问作者Sherif Fanous
相关产品推荐
相关产品推荐

