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

Python logging如何为特定目的地按严重级别配置多种日志格式

实现不同日志等级集合对应不同输出格式的方案

完全可以实现你的需求,目前有两种常用的落地方式,以下是具体说明和可直接运行的示例代码。

方案1:为同一输出目标绑定多个Handler(原生推荐方案)

单个Handler确实仅支持绑定一个Formatter,你可以给同一个输出目的地(比如标准输出stdout)添加多个Handler,每个Handler通过过滤器限制仅处理指定等级集合的日志,再分别绑定对应格式的Formatter即可。

import logging
import sys
from logging import Filter

# 定义只处理INFO等级的过滤器
class InfoOnlyFilter(Filter):
    def filter(self, record):
        return record.levelno == logging.INFO

# 定义处理除INFO外所有等级的过滤器
class NonInfoFilter(Filter):
    def filter(self, record):
        return record.levelno != logging.INFO

# 初始化Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # 全局等级设为你需要捕获的最低等级

# 配置INFO等级专用Handler
info_handler = logging.StreamHandler(sys.stdout)
info_handler.setLevel(logging.INFO)
info_handler.addFilter(InfoOnlyFilter())
info_formatter = logging.Formatter("【INFO提示】 %(asctime)s | %(message)s")
info_handler.setFormatter(info_formatter)

# 配置其他等级通用Handler
other_handler = logging.StreamHandler(sys.stdout)
other_handler.setLevel(logging.DEBUG)
other_handler.addFilter(NonInfoFilter())
other_formatter = logging.Formatter("%(levelname)s | %(asctime)s | 行号:%(lineno)d | %(message)s")
other_handler.setFormatter(other_formatter)

# 把两个Handler都挂载到Logger上
logger.addHandler(info_handler)
logger.addHandler(other_handler)

# 测试
logger.debug("调试信息")
logger.info("普通通知")
logger.warning("警告信息")
logger.error("报错信息")

方案2:自定义Formatter动态切换格式

如果不想挂载多个Handler,可以直接重写Formatter的format方法,根据日志等级动态匹配对应的输出格式,代码更简洁:

import logging
import sys

class LevelDiffFormatter(logging.Formatter):
    # 定义各等级集合对应的格式
    INFO_FORMAT = "【INFO提示】 %(asctime)s | %(message)s"
    DEFAULT_FORMAT = "%(levelname)s | %(asctime)s | 行号:%(lineno)d | %(message)s"

    def format(self, record):
        # 按等级切换格式
        if record.levelno == logging.INFO:
            self._style._fmt = self.INFO_FORMAT
        else:
            self._style._fmt = self.DEFAULT_FORMAT
        return super().format(record)

# 初始化Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(LevelDiffFormatter())
logger.addHandler(handler)

# 测试效果和方案1完全一致
logger.debug("调试信息")
logger.info("普通通知")
logger.warning("警告信息")
  • 如果你需要划分更多等级集合,只要调整过滤器的判断条件、或者自定义Formatter里的格式匹配规则即可,比如要把DEBUG和INFO归为一组、WARNING/ERROR/CRITICAL归为另一组,修改对应的等级判断逻辑就可以实现。

内容的提问来源于stack exchange,提问作者freeman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:06:03