如何用Python中传播的方法参数覆盖错误日志记录?

如何用Python中传播的方法参数覆盖错误日志记录?,python,python-3.x,logging,metaprogramming,Python,Python 3.x,Logging,Metaprogramming,我想将触发错误级别日志的方法的参数注入日志 我看了这个问题,我认为inspect库是获取方法参数的一个好选择: 虽然理想情况下,我只想调用上面的inspect代码来自动将信息添加到错误级别日志中,并且只有在调用它们时才会覆盖错误日志。这是一个有趣的问题。基本上你可以: 用于从新的error函数中获取调用者帧 如前所述覆盖默认函数 用于使包装函数看起来像包装函数 结果如下所示: from functools import wraps import logging import inspect

我想将触发错误级别日志的方法的参数注入日志

我看了这个问题,我认为inspect库是获取方法参数的一个好选择:


虽然理想情况下,我只想调用上面的inspect代码来自动将信息添加到错误级别日志中,并且只有在调用它们时才会覆盖错误日志。

这是一个有趣的问题。基本上你可以:

  • 用于从新的
    error
    函数中获取调用者帧

  • 如前所述覆盖默认函数

  • 用于使包装函数看起来像包装函数

结果如下所示:

from functools import wraps
import logging
import inspect

# save the old logging.error function
__logging_error = logging.error

@wraps(logging.error)
def error(msg, *args, **kwargs):
    __logging_error(msg, *args, **kwargs)
    caller = inspect.stack()[1]
    caller_frame = caller[0]
    __logging_error('args: %s' % caller_frame.f_locals)

# overwrite the default logging.error
logging.error = error
现在代码是:

def add(x, y):
    logging.error('this is an error')
    return x + y

add(4, 5)
产出:

ERROR:root:this is an error
ERROR:root:args: {'y': 5, 'x': 4}

谢谢你的回答,你的代码抛出了一个递归错误,但退一步到堆栈中是解决我问题的一个简单方法。@chrisvlll:这很奇怪,它没有向我抛出任何东西。在这里尝试整个脚本:抱歉,我在ipython中运行了多次,由于猴子补丁,它抛出了一个递归错误
ERROR:root:this is an error
ERROR:root:args: {'y': 5, 'x': 4}