Python 3.12 logging - 07 - LogRecord

Python 3.12 logging - 07 - LogRecord

LogRecord的基本概念

LogRecord 是 Python logging 模块中代表一条日志事件的数据容器。简单来说,它就像一张“记录单”,每当程序调用日志方法(如 logger.info())时,logging 会自动创建一个 LogRecord 对象,并把所有相关信息都装进去,包括:日志消息内容、日志级别(DEBUG/INFO 等)、产生日志的时间戳、源代码位置(文件名、行号、函数名)、当前线程/进程 ID、异常信息(如果有)、其他自定义属性(通过 extra 添加)。
这个“记录单”随后会被传递给日志处理器(Handler)和格式化器(Formatter),最终被转换成我们看到的输出文本。


一、LogRecord类机制解析

LogRecordlogging模块的核心类,用于封装日志事件的所有信息。每次记录事件时,系统都会生成LogRecord实例。其包含与所记录事件相关的全部信息。
传递的主要信息位于msg和args中,通过str(msg) % args组合形成记录的消息字段,实际的消息格式化在 getMessage() 中完成。

其核心机制包括:

1. 动态属性管理
  • 属性存储:通过__init__动态存储字段(如msg, levelname等)
  • 延迟格式化:如message属性在访问时通过getMessage(),解析msgargs
  • 默认属性集:包含多个字段信息(如namepathnamelinenoexc_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():合并msgargs生成最终日志消息

defgetMessage(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. 处理:经由FilterFormatter等组件
  3. 输出:通过Handler写入目标(文件/网络等)

三、完整Demo实现

import logging import logging.config import time classCustomLogRecord(logging.LogRecord):"""扩展LogRecord以添加自定义字段"""def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs) self.custom_id =hash(time.time())# 添加唯一IDdefcustom_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_fieldclassDefaultCustomFieldFilter(logging.Filter):def__init__(self, default_value="d"):super().__init__() self.default_value = default_value deffilter(self, record):ifnothasattr(record,'custom_field'): record.custom_field = self.default_value returnTrue# 返回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":""}}}defmain():# 应用配置并设置自定义工厂 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/0except Exception as e: logger.error("Math error occurred", exc_info=True)if __name__ =="__main__": main()

四、关键输出解析

执行上述代码将输出:

自定义字段

五、性能优化建议

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

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

本篇博客中,如有存在偏差或是错误的地方,请私信我哈,欢迎指正。

Read more

Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构 前言 在鸿蒙(OpenHarmony)生态迈向大规模工业化协同、涉及超大型项目敏捷迭代、海量模块解耦及严苛 AOT 性能交付标准的背景下,如何实现一套能够自动拦截低质量代码、保障跨团队开发风格绝对统一且符合鸿蒙性能极致要求的“静态扫描中心”,已成为决定应用长期可维护性与研发效能感的关键。在鸿蒙设备这类强调 AOT 静态优化与严格类型安全的环境下,如果应用代码中充斥着滥用的 dynamic 调用或循环引用,由于由于编译期的类型擦除与运行时的屏障开销,极易由于由于“代码腐化”导致鸿蒙应用在长期运行后发生不可预知的内存泄露。 我们需要一种能够强制约束研发纪律、支持自定义规则扩展且具备“一站式”合规性判定的 Linter 方案。 saropa_lints 为 Flutter 开发者引入了“质量铁律”范式。它不是简单的代码检查

By Ne0inhk
Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 objectbox_generator — 自动化构建鸿蒙极速 NoSQL 数据库映射(适配鸿蒙 HarmonyOS Next ohos) 在高性能移动应用开发中,本地数据的持久化存储效率往往是决定用户感知流畅度的木桶短板。传统的 SQLite 虽然结构化程度高,但在处理大规模对象关系映射(ORM)时,复杂的 SQL 拼接和反射解析往往会成为性能瓶颈。 ObjectBox 作为一个专为移动设备打造的、跨平台的超高速 NoSQL 数据库,已经成为了许多追求极致体验开发者的首选。而在 Flutter for OpenHarmony 开发中,配合 objectbox_generator,我们可以通过注解驱动的自动化流程,掌握这套高性能数据库的核心用法。 ⚠️ 鸿蒙适配现状提示:截至本文撰写时,ObjectBox 的 Dart 插件尚未提供官方的 OpenHarmony

By Ne0inhk
Spring Cloud 熔断降级详解:用 “保险丝“ 类比,Sentinel 实战教程

Spring Cloud 熔断降级详解:用 “保险丝“ 类比,Sentinel 实战教程

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 📋 目录 * 什么是熔断降级 * 定义 * 为什么需要熔断降级? * 保险丝类比:形象理解熔断机制 * 生活中的保险丝 * 熔断器工作原理对比 * 熔断器三种状态 * Sentinel 核心概念 * 什么是 Sentinel? * 核心概念对比 * Sentinel vs Hystrix 对比 * Sentinel 实战教程 * 环境准备 * 1. 添加依赖 * 2. 配置文件 * 基础示例:注解方式 * 3. 主启动类 * 4. 创建订单服务 * 5. 控制器 * 高级配置:规则定义 * 6. 流控规则配置 * OpenFeign 集成 * 7. Feign客户端集成Sentinel * 8. Feign降级处理 * 规则持久化(

By Ne0inhk