You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让LoggerMixin记录调用函数名及所属对象属性?

解决方案

下面是调整后的代码,可实现LoggerMixin记录调用函数名及对象属性的需求:

import logging
import inspect


class LoggerMixin:
    def log(self):
        # 配置日志基础格式
        logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
        # 通过调用栈获取直接调用log方法的函数名称
        caller_func_name = inspect.stack()[1].function
        # 收集对象的非私有属性(过滤下划线开头的属性)
        obj_attrs = {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
        # 构造并输出日志
        log_msg = f"调用函数: {caller_func_name} | 对象属性: {obj_attrs}"
        logging.info(log_msg)


class Car(LoggerMixin):
    def __init__(self, brand: str, wheel: int):
        self.brand = brand
        self.wheel = wheel

    def info(self):
        print(f'my brand is {self.brand} and i have {self.wheel} wheel')
        # 触发日志记录
        self.log()


obj1 = Car(brand='bmw', wheel=4)
obj1.info()

关键改动说明

  • 获取调用函数名:借助inspect.stack()获取调用栈信息,inspect.stack()[1].function可直接拿到触发日志的上层函数名(如示例中的info)。
  • 收集对象属性:通过self.__dict__遍历实例属性,过滤掉私有属性后整理成键值对,确保只记录业务相关属性。
  • 触发日志逻辑:在Car类的业务方法info中主动调用self.log(),将日志记录与业务逻辑绑定。

运行代码后会输出:

my brand is bmw and i have 4 wheel
INFO - 调用函数: info | 对象属性: {'brand': 'bmw', 'wheel': 4}

如果需要指定只记录特定属性,可修改log方法为带参形式:

def log(self, target_attrs=None):
    logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
    caller_func_name = inspect.stack()[1].function
    if target_attrs:
        # 仅收集指定的属性
        obj_attrs = {k: getattr(self, k) for k in target_attrs if hasattr(self, k)}
    else:
        obj_attrs = {k: v for k, v in self.__dict__.items() if not k.startswith('_')}
    log_msg = f"调用函数: {caller_func_name} | 对象属性: {obj_attrs}"
    logging.info(log_msg)

调用时传入指定属性即可:

self.log(target_attrs=['brand'])

内容的提问来源于stack exchange,提问作者comiser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:45:58