通用日志记录函数包装器



所以我要做的基本上是从常用的库(如子进程,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 都来自日志记录模块

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

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

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', parameters : ('a',( and {}

错误:根:不支持/的操作数类型:"str"和"int">

回溯(最近一次调用(: 文件"C:/Users/xxxx.py",第 9 行,包装器 return func(*args, **kwargs( 文件 "C:/Users/xxxx.py",第 17 行,在 foo 中 打印(Val/2(

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

最新更新