Python的logging日志库中%() 格式化方式详解

目录

1. 基本语法

2. logging 模块中的 %() 格式化

3. 为什么 logging 使用 %() 而不是 f-string 或 str.format()?

4. 常见占位符

5. 对比 %() / .format() / f-string

6. 总结


%() 是 Python 中一种旧式字符串格式化(Old-style String Formatting)的方式,主要用于 logging 模块的日志格式定义,也常见于早期的 Python 代码中。它的语法类似于 C 语言的 printf 风格。

1. 基本语法

%() 格式化的一般形式:

"格式化字符串" % (变量1, 变量2, ...)

或(在 logging 模块中):

"%(key1)s %(key2)d" % {"key1": "value1", "key2": 123}

示例

(1) 普通变量格式化
name = "Alice"
age = 25
print("Name: %s, Age: %d" % (name, age))

输出:

Name: Alice, Age: 25
  • %s → 字符串(str
  • %d → 十进制整数(int
(2) 字典变量格式化(logging 常用方式)
data = {"name": "Bob", "age": 30}
print("Name: %(name)s, Age: %(age)d" % data)

输出:

Name: Bob, Age: 30
  • %(name)s → 从字典 data 中取 "name" 的值,并格式化为字符串
  • %(age)d → 从字典 data 中取 "age" 的值,并格式化为整数

2. logging 模块中的 %() 格式化

在 logging 模块中,basicConfig(format=...) 使用 %() 的方式定义日志格式,其中:

  • %() 中的 key 是预定义的日志属性(如 asctimefilenamemessage 等)。
  • s / d 表示数据类型。

示例

import logging

logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

logging.info("This is a log message")

输出:

2023-10-01 12:00:00,000 - root - INFO - This is a log message
  • %(asctime)s → 日志时间(字符串)
  • %(name)s → Logger 名称(字符串,默认 "root"
  • %(levelname)s → 日志级别(字符串,如 "INFO"
  • %(message)s → 日志消息(字符串)

3. 为什么 logging 使用 %() 而不是 f-string 或 str.format()

历史原因

logging 模块在 Python 早期版本就已存在,而 f-string(Python 3.6+)和 str.format()(Python 2.6+)是后来才引入的。

性能优化

%() 格式化在 logging 内部经过优化,比 f-string 或 .format() 更高效,因为日志可能被频繁调用。

结构化数据支持

%() 可以直接从字典读取变量(如 %(message)s),而 f-string 需要显式传递变量。

4. 常见占位符

占位符数据类型示例
%s字符串"Name: %s" % "Alice" → "Name: Alice"
%d整数"Age: %d" % 25 → "Age: 25"
%f浮点数"Price: %f" % 3.14 → "Price: 3.140000"
%.2f保留 2 位小数"Price: %.2f" % 3.14159 → "Price: 3.14"
%x十六进制"Hex: %x" % 255 → "Hex: ff"

5. 对比 %() / .format() / f-string

方式示例Python 版本适用场景
%()"Name: %s" % "Alice"所有版本logging 模块、旧代码
.format()"Name: {}".format("Alice")Python 2.6+较新的代码
f-stringf"Name: {'Alice'}"Python 3.6+现代 Python 代码

6. 总结

  • %() 是 Python 的旧式字符串格式化方法,在 logging 模块中广泛使用。
  • %(key)s 表示从字典中取 key 的值并格式化为字符串,%(key)d 格式化为整数。
  • logging 使用 %() 主要因为历史兼容性性能优化
  • 现代 Python 代码推荐使用 f-string,但在 logging 中仍然推荐 %() 方式。

示例回顾

import logging

logging.basicConfig(
    format='%(asctime)s - %(message)s',  # %() 格式化
    level=logging.INFO
)

logging.info("Hello, %s!", "World")  # 输出:2023-10-01 12:00:00,000 - Hello, World!
  • %(asctime)s → 自动填充时间
  • %(message)s → 获取 logging.info() 的内容

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值