Python 3.8 logging模块如何按日志级别设置不同输出格式
Python logging按日志级别动态切换输出格式解决方案
实现思路
通过自定义logging.Formatter子类,重写format方法,根据传入的日志记录(LogRecord)的级别动态选择格式化模板,无需依赖LoggerAdapter、Filter等复杂方案,完全兼容Python 3.8版本。
完整实现代码
import logging class LevelBasedFormatter(logging.Formatter): # 定义DEBUG级别专属格式 DEBUG_FORMAT = "%(asctime)s %(filename)s, line %(lineno)d : %(name)s %(levelname)s %(message)s" # 定义其他级别通用格式 COMMON_FORMAT = "%(asctime)s %(levelname)s %(message)s" def format(self, record): # 按日志级别选择对应格式,该写法线程安全,多线程场景无状态冲突 if record.levelno == logging.DEBUG: return logging.Formatter(self.DEBUG_FORMAT).format(record) else: return logging.Formatter(self.COMMON_FORMAT).format(record) # 日志配置与测试 if __name__ == "__main__": # 初始化logger logger = logging.getLogger("demo_logger") logger.setLevel(logging.DEBUG) # 新建控制台输出处理器 console_handler = logging.StreamHandler() # 给处理器绑定自定义格式化器 console_handler.setFormatter(LevelBasedFormatter()) # 将处理器添加到logger logger.addHandler(console_handler) # 测试调用,和示例写法完全一致 logger.debug("debug message") logger.info("info message") logger.warning("warning test") logger.error("error test")
输出效果
2024-05-20 15:22:31,456 test.py, line 27 : demo_logger DEBUG debug message 2024-05-20 15:22:31,457 INFO info message 2024-05-20 15:22:31,457 WARNING warning test 2024-05-20 15:22:31,457 ERROR error test
可选优化
如果是单线程场景,也可以用修改当前实例格式属性的写法,性能略高:
def format(self, record): if record.levelno == logging.DEBUG: self._style._fmt = self.DEBUG_FORMAT else: self._style._fmt = self.COMMON_FORMAT return super().format(record)
注意事项
- 该方案不需要修改原有日志调用逻辑,直接替换原有Formatter即可生效
- 如果需要同时适配文件日志、控制台日志的不同格式规则,给对应处理器分别设置自定义Formatter即可
内容的提问来源于stack exchange,提问作者Eric H.
相关产品推荐
相关产品推荐

