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!

解释

  1. 装饰器定义logexecution 是一个装饰器函数,它接受一个函数 func 作为参数,并返回一个新的函数 wrapper
  2. @functools.wraps:使用 wraps 来保持被装饰函数的元数据(如函数名和文档字符串)。
  3. 记录日志:在 wrapper 函数内部,使用 logging.info 在函数执行前后记录日志。
  4. 异常处理:在调用被装饰函数时,如果发生异常,它将被正常抛出,并且可以在调用者处被捕获和处理。在这个例子中,我们捕获了 ValueError 并记录了错误日志。
  5. 返回结果:返回被装饰函数的执行结果。

注意事项

  • 日志装饰器对于任何可调用对象都适用,包括函数、方法和类方法。
  • 日志级别(如 INFODEBUGWARNINGERROR 等)可以根据需要进行调整。
  • 如果你的函数接受可变数量的参数(包括位置参数、关键字参数、默认参数等),装饰器应该能够正确处理这些参数(上面的 *args 和 **kwargs 确保了这一点)。
  • 在实际应用中,你可能希望将日志配置(如日志文件名、日志级别、日志格式等)放在一个单独的配置文件中,而不是直接在代码中硬编码。
posted @ 2024-12-20 14:48  公子Learningcarer  阅读(7)  评论(0编辑  收藏  举报