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

如何配置Python日志以指定格式化风格(百分号/括号/F-string)

Python logging指定格式化风格的配置方法

Python支持三种主流的字符串格式化风格:

  • 旧风格(百分号%):"The first number is %s" % (1,)
  • 新风格(str.format/{}):"The first number is {}".format(1)
  • F-string:one = 1; f"the first number is {one}"

手动在日志调用时提前格式化字符串(比如log.error("the first number is {}".format(1)))存在两个问题:一是当日志级别未启用时,格式化操作白做,浪费性能;二是格式化复杂对象时容易触发意外的bug。下面是让logging自动处理格式化、指定对应风格的配置方法:

1. 旧风格(百分号%)

这是Python logging模块的默认格式化风格,无需额外配置,直接在日志调用时传入格式化字符串和参数即可,logging会在确定要输出日志时才执行格式化:

import logging
logging.basicConfig(level=logging.ERROR)
logging.error("The first number is %s", 1)

2. 新风格(str.format/{})

需要显式指定Formatter的style参数为'{',有两种配置方式:

全局基础配置

通过basicConfig直接指定:

import logging
logging.basicConfig(
    level=logging.ERROR,
    format="%(levelname)s: The first number is {0}",
    style='{'  # 指定使用str.format风格
)
logging.error(1)

自定义Formatter(适用于复杂日志配置)

如果需要给不同Handler配置不同格式,可以自定义Formatter并绑定:

import logging

# 创建Formatter并指定风格
formatter = logging.Formatter(
    "%(asctime)s - %(name)s - %(levelname)s - {message}",
    style='{'
)

# 创建Handler并绑定Formatter
handler = logging.StreamHandler()
handler.setFormatter(formatter)

# 配置Logger
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.setLevel(logging.ERROR)

# 调用日志
logger.error("The first number is {}", 1)

3. F-string

F-string是即时求值的,无法直接让logging延迟格式化。要实现“仅当日志输出时才格式化”的效果,可以通过包装函数实现:

import logging

def log_error(msg_provider, *args, **kwargs):
    # 先判断当前日志级别是否启用,避免无效计算
    if logging.getLogger(__name__).isEnabledFor(logging.ERROR):
        logging.error(msg_provider(), *args, **kwargs)

# 使用示例
one = 1
log_error(lambda: f"The first number is {one}")

这种方式通过lambda将F-string的格式化逻辑延迟到日志需要输出时才执行,兼顾了F-string的简洁性和logging的性能优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:22:50