LogRecord 基本概念
LogRecord 是 Python logging 模块中代表一条日志事件的数据容器。简单来说,它就像一张'记录单',每当程序调用日志方法(如 logger.info())时,logging 会自动创建一个 LogRecord 对象,并把所有相关信息都装进去,包括:日志消息内容、日志级别(DEBUG/INFO 等)、产生日志的时间戳、源代码位置(文件名、行号、函数名)、当前线程/进程 ID、异常信息(如果有)、其他自定义属性(通过 extra 添加)。 这个'记录单'随后会被传递给日志处理器(Handler)和格式化器(Formatter),最终被转换成我们看到的输出文本。
LogRecord 类机制解析
LogRecord是logging模块的核心类,用于封装日志事件的所有信息。每次记录事件时,系统都会生成 LogRecord 实例。其包含与所记录事件相关的全部信息。
传递的主要信息位于 msg 和 args 中,通过str(msg) % args组合形成记录的消息字段,实际的消息格式化在 getMessage() 中完成。
1. 动态属性管理
- 属性存储:通过
__init__动态存储字段(如msg,levelname等) - 延迟格式化:如
message属性在访问时通过getMessage(),解析msg与args - 默认属性集:包含多个字段信息(如
name,pathname,lineno,exc_info,sinfo等)
2. 工厂模式
通过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)
3. 关键方法
getMessage():合并msg与args生成最终日志消息
def getMessage(self):
""" Return the message for this LogRecord.
Return the message for this LogRecord after merging any user-supplied arguments with the message.
如果存在 args,则使用 % 运算符进行格式化,并返回最终消息字符串。
当 args 为空元组或空字典或 None 时,也为假,不进行格式化)。
该方法在格式化器(Formatter)中被调用,用于获取消息部分
"""
msg = str(.msg)
.args:
msg = msg % .args
msg


