以下代码(或来自 在 Python 中记录方法调用的更好方法? 的自定义解决方案或使用
inspect
的解决方案)可用于记录方法调用:
import logging, sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logger = logging.getLogger()
def log(func):
def logged(*args, **kwargs):
logger.info(f"{func.__name__} starting with {args=} {kwargs=}...")
result = func(*args, **kwargs)
logger.info(f"{func.__name__} finished.")
return result
return logged
class A:
@log
def foo(self, x, y):
pass
@log
def bar(self, x, y):
1/0
a = A()
a.foo(2, y=3)
a.bar(2, y=3)
输出:
INFO:root:foo starting with args=(<__main__.A object at 0x0000000002784EE0>, 2) kwargs={'y': 3}...
INFO:root:foo finished.
INFO:root:bar starting with args=(<__main__.A object at 0x0000000002784EE0>, 2) kwargs={'y': 3}...
...
当前 Python 版本中是否有内置解决方案(在
logging
或其他模块中)?
尝试在装饰器中使用 try except 代码。
尝试:
结果 = func(*args, **kwargs)
除了 NameError 为 e:
logger.Exception(f"异常: {str(e)}")