Python 3.12 Logging 核心:LogRecord 机制解析与定制实战
LogRecord 是 Python logging 模块中代表一条日志事件的数据容器。简单来说,它就像一张'记录单',每当程序调用日志方法(如 logger.info())时,logging 会自动创建一个 LogRecord 对象,并把所有相关信息都装进去,包括日志消息内容、级别、时间戳、源代码位置、线程信息以及异常详情等。这个对象随后会被传递给处理器(Handler)和格式化器(Formatter),最终转换成我们看到的文本。
LogRecord 的核心机制
LogRecord 封装了日志事件的所有细节。每次记录事件时,系统都会生成一个实例。主要信息位于 msg 和 args 中,通过 % 运算符组合形成最终的消息字段,实际格式化在 getMessage() 方法中完成。
动态属性管理
LogRecord 通过 __init__ 动态存储字段,例如 msg、levelname 等。值得注意的是,像 message 这样的属性支持延迟格式化——只有在访问时才会调用 getMessage() 解析 msg 与 args。默认情况下,它包含了一系列标准字段,如 name、pathname、lineno、exc_info 等。
工厂模式创建
除了常规流程,我们还可以利用 logging.makeLogRecord(dict) 工厂方法手动创建实例,这在测试或特殊场景下很有用:
record_dict = {
"name": "demo",
"level": 20,
"pathname": "/app/main.py",
"msg": "User %s logged in",
"args": ("Alice",)
}
record = logging.makeLogRecord(record_dict)
关键方法解析
getMessage() 负责合并 msg 与 args 生成最终日志消息。如果存在 args,则使用 % 运算符进行格式化;当 args 为空元组、空字典或 None 时,直接返回消息字符串。该方法通常在 Formatter 中被调用。
def getMessage(self):
"""Return the message for this LogRecord."""
msg = str(self.msg)
if self.args:
msg = msg % self.args
msg


