python 日志装饰器@logexecution 用法及案例
在Python中,日志装饰器(@logexecution
)是一种用于在函数或方法执行前后自动记录日志的装饰器。这种装饰器对于调试、监控和审计代码执行非常有用。下面是一个简单的日志装饰器的实现及其用法案例:
日志装饰器实现
import logging
import functools
# 配置日志记录器(可选,但通常建议这样做)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def logexecution(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logging.info(f"Executing function '{func.__name__}' with arguments {args} {kwargs}")
result = func(*args, **kwargs)
logging.info(f"Function '{func.__name__}' executed successfully")
return result
return wrapper
用法案例
@logexecution
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero!")
return a / b
# 调用函数
try:
result = divide(10, 2)
print(f"Result: {result}")
except ValueError as e:
logging.error(e)
# 尝试除以零以触发异常
try:
result = divide(10, 0)
except ValueError as e:
logging.error(e)
输出结果
2023-xx-xx xx:xx:xx,xxx - INFO - Executing function 'divide' with arguments (10, 2) {}
Result: 5.0
2023-xx-xx xx:xx:xx,xxx - INFO - Function 'divide' executed successfully
2023-xx-xx xx:xx:xx,xxx - ERROR - Cannot divide by zero!
解释
- 装饰器定义:
logexecution
是一个装饰器函数,它接受一个函数func
作为参数,并返回一个新的函数wrapper
。 @functools.wraps
:使用wraps
来保持被装饰函数的元数据(如函数名和文档字符串)。- 记录日志:在
wrapper
函数内部,使用logging.info
在函数执行前后记录日志。 - 异常处理:在调用被装饰函数时,如果发生异常,它将被正常抛出,并且可以在调用者处被捕获和处理。在这个例子中,我们捕获了
ValueError
并记录了错误日志。 - 返回结果:返回被装饰函数的执行结果。
注意事项
- 日志装饰器对于任何可调用对象都适用,包括函数、方法和类方法。
- 日志级别(如
INFO
、DEBUG
、WARNING
、ERROR
等)可以根据需要进行调整。 - 如果你的函数接受可变数量的参数(包括位置参数、关键字参数、默认参数等),装饰器应该能够正确处理这些参数(上面的
*args
和**kwargs
确保了这一点)。 - 在实际应用中,你可能希望将日志配置(如日志文件名、日志级别、日志格式等)放在一个单独的配置文件中,而不是直接在代码中硬编码。