如何在 python 中创建装饰器/包装器 class 以将错误日志的属性作为单个参数传递?
how to create a decorator/ wrapper class in python to pass the attributes of error logs as a single parameter?
class请求(APIView):
@api_view(['GET'])
def test_api_method(self):
print('This is Test API')
db_logger = logging.getLogger('db')
try:
1 / 0
except Exception as e:
db_logger.exception(e, extra={'user': self.user.username, 'class_name': self.__class__.__name__,'method_name': sys._getframe().f_code.co_name,
'module_name': __package__, 'ip_address': socket.gethostbyname(socket.gethostname())})
return Response({'data': True}, status=status.HTTP_200_OK)
我想创建一个装饰器或包装器 class 以将 db_logger.exception() 中的参数作为 sin 单个参数传递。
主要是,我想用一个参数替换这个字典---> extra={............},这样这个错误记录方法就可以用来记录所有 classes 和方法。
查看此示例,了解如何创建装饰器并访问包装函数及其参数。
from functools import wraps
def error_logger(func):
@wraps(func)
def wrapper(*args, **kwd):
try:
return func(*args, **kwd)
except Exception as e:
print('Error in ', func.__name__)
# reference self as: args[0]
return wrapper
class my_class:
@error_logger
def my_function(self):
return 1/0
if __name__ == '__main__':
my_class().my_function()
class请求(APIView):
@api_view(['GET'])
def test_api_method(self):
print('This is Test API')
db_logger = logging.getLogger('db')
try:
1 / 0
except Exception as e:
db_logger.exception(e, extra={'user': self.user.username, 'class_name': self.__class__.__name__,'method_name': sys._getframe().f_code.co_name,
'module_name': __package__, 'ip_address': socket.gethostbyname(socket.gethostname())})
return Response({'data': True}, status=status.HTTP_200_OK)
我想创建一个装饰器或包装器 class 以将 db_logger.exception() 中的参数作为 sin 单个参数传递。 主要是,我想用一个参数替换这个字典---> extra={............},这样这个错误记录方法就可以用来记录所有 classes 和方法。
查看此示例,了解如何创建装饰器并访问包装函数及其参数。
from functools import wraps
def error_logger(func):
@wraps(func)
def wrapper(*args, **kwd):
try:
return func(*args, **kwd)
except Exception as e:
print('Error in ', func.__name__)
# reference self as: args[0]
return wrapper
class my_class:
@error_logger
def my_function(self):
return 1/0
if __name__ == '__main__':
my_class().my_function()