如何让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
相关产品推荐
相关产品推荐

