跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 3.12 logging 模块 LogRecord 详解

Python logging 模块中的 LogRecord 类,它是日志事件的数据容器,封装了消息、级别、时间戳、位置等信息。文章解析了 LogRecord 的动态属性管理、工厂模式及关键方法,展示了其生命周期流程。通过自定义 LogRecord 子类、工厂函数及过滤器,可以实现日志字段的灵活扩展,如添加唯一 ID 或默认值。最后提供了完整的配置与代码示例,说明了如何构建高性能、可扩展的日志架构。

Kubernet发布于 2026/3/29更新于 2026/9/462 浏览
Python 3.12 logging 模块 LogRecord 详解

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(self.msg)
    if self.args:
        msg = msg % self.args
    return msg

LogRecord 生命周期

  1. 创建:由Logger.log()调用Logger.makeRecord()生成
  2. 处理:经由Filter、Formatter等组件
  3. 输出:通过Handler写入目标(文件/网络等)

完整 Demo 实现

import logging
import logging.config
import time

class CustomLogRecord(logging.LogRecord):
    """扩展 LogRecord 以添加自定义字段"""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.custom_id = hash(time.time())  # 添加唯一 ID

def custom_record_factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs):
    """自定义 LogRecord 工厂函数"""
    record = CustomLogRecord(name, level, fn, lno, msg, args, exc_info, func, sinfo)
    return record

# 定义一个过滤器,为记录添加默认的 custom_field
class DefaultCustomFieldFilter(logging.Filter):
    def __init__(self, default_value="d"):
        super().__init__()
        self.default_value = default_value

    def filter(self, record):
        if not hasattr(record, 'custom_field'):
            record.custom_field = self.default_value
        return True  # 返回 True 表示记录通过

# 配置日志系统
logging_config = {
    "version": 1,
    "formatters": {
        "detailed": {
            "format": "[%(asctime)s][%(levelname)s][%(name)s]-[ID=%(custom_id)s]-%(message)s # custom:%(custom_field)s",
            "datefmt": "%Y-%m-%d %H:%M:%S"
        }
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "detailed",
            "level": "DEBUG",
            "filters": ["default_custom_field"]
        }
    },
    "loggers": {
        "demo": {
            "handlers": ["console"],
            "level": "DEBUG"
        }
    },
    "filters": {
        "default_custom_field": {
            "()": DefaultCustomFieldFilter,
            "default_value": ""
        }
    }
}

def main():
    # 应用配置并设置自定义工厂
    logging.config.dictConfig(logging_config)
    logging.setLogRecordFactory(custom_record_factory)
    logger = logging.getLogger("demo")

    # 标准日志记录
    logger.info("Service started")

    # 添加自定义字段
    logger.debug("Debug with extra", extra={"custom_field": "debug_value"})

    # 异常处理示例
    try:
        1 / 0
    except Exception as e:
        logger.error("Math error occurred", exc_info=True)

if __name__ == "__main__":
    main()

关键输出解析

执行上述代码将输出自定义字段及日志信息。

性能优化建议

  1. 避免冗余计算:在Filter中尽早过滤低级别日志

总结

LogRecord作为日志系统的核心载体,通过灵活的属性和工厂机制支持深度定制。结合 Python 3.12 的优化特性(如 PEP 657 精确错误定位),可构建高性能、可扩展的日志架构。实际开发中应善用extra参数和自定义工厂实现业务级日志增强。

目录

  1. LogRecord 基本概念
  2. LogRecord 类机制解析
  3. 1. 动态属性管理
  4. 2. 工厂模式
  5. 3. 关键方法
  6. LogRecord 生命周期
  7. 完整 Demo 实现
  8. 定义一个过滤器,为记录添加默认的 custom_field
  9. 配置日志系统
  10. 关键输出解析
  11. 性能优化建议
  12. 总结

更多推荐文章

查看全部
  • 腾讯算法岗面试经验总结:机器学习与大模型基础
  • Neo4j 图数据库从搭建到项目使用深度详解
  • LLaMA-Factory 微调 Qwen3-VL 详细流程
  • 文心一言:百度国产大模型的技术解析与应用
  • OpenClaw 与 Claude Code、Cursor、Copilot 的核心区别
  • SmolVLA 高算力适配:TensorRT 加速可行性分析与 ONNX 导出实操
  • 拆解机器人底盘 DDSM400 钕强磁外转子 65mm 伺服轮毂电机
  • 企业微信群机器人发送 Markdown 消息支持表格及艾特功能
  • OpenClaw 国内大模型调用限制与配置方案
  • Ansible 批量部署 Nginx 实战指南
  • M2FP 多人人体解析:WebUI 交互与 5 款互补开源模型
  • 手机检测系统上传失败重试机制与用户体验优化
  • 前端 Markdown 渲染:从基础到实战
  • CC Switch 常见问题解答与故障排除指南
  • 运维工程师转型网络安全网盾工程师的职业路径与技能指南
  • 云开发 Copilot 功能介绍与低代码生成实战
  • Gemini 全能 QQ 机器人部署手册
  • Dynamics 365 Web API 对接外部系统:数据双向同步方案
  • 云开发 Copilot:AI 驱动的低代码开发实践
  • Sentry 前端监控配置:AI 应用错误上报与隐私保护

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online