内置装饰器来记录方法调用

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

以下代码(或来自 在 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
或其他模块中)?

python python-decorators python-logging
1个回答
-1
投票

尝试在装饰器中使用 try except 代码。

尝试: 结果 = func(*args, **kwargs)
除了 NameError 为 e: logger.Exception(f"异常: {str(e)}")

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