通用日志记录功能包装器

问题描述 投票:0回答:2

所以我想做的本质上是从常用的库(例如 subprocess、shutil 等)中获取一堆预先存在的函数,并将它们包装在一个函数中,该函数将输出该函数正在执行的操作以及错误(如果发生)。我当前的代码看起来像这样。

def copytree(self,*args, **kwargs):
    self.debug(f":- Copying tree from \"{args[0]}\" to \"{args[1]}\"")
    try:
        shutil.copytree(*args,**kwargs)
    except Exception as e:
        self.error(f":- Failed to copy tree from \"{args[0]}\" to \"{args[1]}\" ; \"{e}\"")
        return False        
    self.debug(f":- Done")
    return True

我觉得可能有更好的方法来做到这一点,其中有一个可以在任何函数上使用的通用包装器,但我在概念化它时遇到了困难。我也不确定是否有一种方法可以解释在所述通用包装器中不会引发异常的函数。

另外:self.debug 和 self.error 都来自日志模块

python python-3.x
2个回答
4
投票

我会使用函数装饰器日志记录模块。

这是一个简单而肮脏的例子:

import logging
logging.basicConfig(level=logging.INFO)


# decorator
def logged(func):
    def wrapper(*args, **kwargs):
        try:
            logging.info("started '{0}', parameters : {1} and {2}".
                         format(func.__name__, args, kwargs))
            return func(*args, **kwargs)
        except Exception as e:
            logging.exception(e)
    return wrapper


@logged
def foo(val):
    print(val/2)


if __name__ == "__main__":
    foo("a")

输出:

INFO:root:started 'foo', 参数: ('a',) 和 {}

错误:root:/不支持的操作数类型:“str”和“int”

回溯(最近一次调用最后一次): 文件“C:/Users/xxxx.py”,第 9 行,包装器中 返回 func(*args, **kwargs) 文件“C:/Users/xxxx.py”,第 17 行,位于 foo 中 打印(val/2)

类型错误:/ 不支持的操作数类型:“str”和“int”


0
投票

我推荐这个方法:

def log_function(logger: Logger):
    def logger_wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            logger.info(f"Called {func.__name__}({args}, {kwargs})")
            func(*args, **kwargs)

        return inner

    return logger_wrapper

你可以像这样使用它

@log_function(logger=getLogger())
def foo(val):
    print(val/2)

这允许您根据需要配置记录器。

© www.soinside.com 2019 - 2024. All rights reserved.