探索Python日志:深入理解LogRecord对象

源码分享
https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tab=BB08J2

在Python的日志系统中,LogRecord对象扮演着中心角色。每当我们在代码中使用日志记录方法,如​​.debug()​​, ​​.info()​​, ​​.warning()​​, ​​.error()​​ 或 ​​.critical()​​,底层日志模块会创建一个LogRecord实例,该实例封装了所有与日志事件相关的信息。本篇技术博客将详细介绍LogRecord对象的工作原理,并通过代码案例展示如何自定义和操作这些对象,以便在构建爬虫时更高效地管理日志信息。

LogRecord概述

LogRecord是一个由Python内置​​logging​​模块自动创建的类实例,用于表示一个日志事件的所有信息。当发生一个日志事件时,Logger对象会创建LogRecord实例,然后将其传递给所有相关的Handlers进行处理。

LogRecord对象包含许多属性,这些属性包括:

  • ​name​​:日志记录器的名称。
  • ​levelno​​:数值形式的日志等级(例如,DEBUG, INFO, WARNING, ERROR, CRITICAL)。
  • ​levelname​​:文本形式的日志等级。
  • ​pathname​​:调用日志记录函数的源文件的路径。
  • ​filename​​:源文件的文件名部分。
  • ​module​​:源文件的模块名部分。
  • ​lineno​​:调用日志记录函数的语句所在的代码行号。
  • ​funcName​​:调用日志记录函数的函数或方法名。
  • ​msg​​:原始日志消息。
  • ​args​​:与日志消息一起合并的参数。
  • ​exc_info​​:异常元组(如果日志消息是在异常处理期间产生的)。

自定义LogRecord对象

您可以通过继承​​logging.LogRecord​​类并重载其构造方法来自定义LogRecord对象,以便添加额外的字段,这在需要记录爬虫特定数据时特别有用。

import logging

class CustomLogRecord(logging.LogRecord):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.custom_attribute = '自定义属性值'

# 使用Factory函数来告诉Logger使用自定义的LogRecord
logging.setLogRecordFactory(CustomLogRecord)

# 创建Logger
logger = logging.getLogger('spider')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(custom_attribute)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

# 记录一条消息
logger.info('这是一个测试消息。')

使用LogRecord对象的属性

在自定义Formatter和Filter时,可以利用LogRecord的属性来创建复杂的日志格式或者筛选日志。

自定义Formatter

class CustomFormatter(logging.Formatter):
    def format(self, record):
        # 调用父类格式化方法
        result = super().format(record)
        # 添加额外的处理
        return f"{result} - {record.filename}:{record.lineno} - {record.funcName}"

formatter = CustomFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

自定义Filter

class CustomFilter(logging.Filter):
    def filter(self, record):
        # 只允许错误级别以上包含特定消息的记录通过
        return record.levelno >= logging.ERROR and "特定错误" in record.getMessage()

filter = CustomFilter()
logger.addFilter(filter)

结语

LogRecord对象是Python日志系统的基石,它提供了日志事件的所有详细信息。通过深入了解LogRecord,您可以自定义复杂的日志格式,根据日志的内容和上下文信息灵活地过滤日志,以及为日志添加特定于应用程序的附加数据。在爬虫项目中,合理地运用LogRecord的自定义和扩展,将帮助您更有效地追踪爬虫的状态、调试问题,并保持日志信息的清晰和有序。希望本篇博客对您的Python爬虫之旅有所帮助,祝您日志管理愉快!

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值