You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:27:01