python - 包装器导致自定义 python 记录器中的 funcName 属性发生变化

标签 python logging wrapper

我在自定义 python 记录器中创建了一个包装器,以在日志格式化程序中添加其他属性。

logFormat = logging.Formatter('[%(levelname)s],[%(asctime)-15s], %(API_SERVER)s, %(funcName)s,%(lineno)d, %(message)s')

附加属性 -> API_SERVER

日志将包装方法显示为 funcName,而不是实际的 funcName。

[DEBUG],[2017-05-23 17:52:13,865], jupiter-api-server, loggingMethodsWrapper,91, Response returned from DolphinD is 200, returning status success, to caller.

包装代码-->

def loggingMethodsWrapper(self, logLevelMethod, *kargs):
    # Calling method logging methods dynamcially
    # Add the parameters in the extra if you want to add
    # more columns in logging format
    getattr(self.log, logLevelMethod)(
          *kargs, extra={'API_SERVER': self.API_SERVER})

最佳答案

发生了错误的函数名称,因为 loggingMethodsWrapper 是实际调用日志的函数。


您想要的似乎是调用loggingMethodsWrapper的函数。解决方法是更改​​格式化程序,使其不包含 %(funcName)s 并将其移至传递给 %(message)s 的参数的一部分,或者作为额外参数。


选项 1:

这样做的一个肮脏的修复方法是让你的包装器沿着堆栈向上走并获取下一个函数。

在 python2 中,这会像:

caller = inspect.stack()[1][3]

在 python3 上,这将是:

caller = inspect.stack()[1].filename

所以:

logFormat = logging.Formatter('[%(levelname)s],[%(asctime)-15s], %(API_SERVER)s, %(CALLER)s,%(lineno)d, %(message)s')

...

def loggingMethodsWrapper(self, logLevelMethod, *kargs):
    caller = # python-specific method of getting caller
    getattr(self.log, logLevelMethod)(
          *kargs, extra={'CALLER' : caller, 'API_SERVER': self.API_SERVER})


选项 2:

如果您可以更改调用者,则可以简单修复 - 将函数名称传递给记录器包装器

loggingMethodsWrapper(self, func_name, logLevelMethod, *kargs):
    ....

然后当你调用它时

def foo():
    loggingMethodsWrapper(foo.__name__, log_level, ...)

关于python - 包装器导致自定义 python 记录器中的 funcName 属性发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44164587/

相关文章:

java - 整数对象缓存

python - 如何使用 Python 从 U+0043 转换为 C?

python - 在 Django 模型中正确定义此数据关系

python - 在 Python/Pandas/PostgreSQL 中将表名作为函数参数传递

python - 如何删除 tf.logging.info 打印出的前缀

python - 为特定请求/URL/端点禁用登录 gunicorn

linux - 如何在文件中捕获 top 命令的输出(对于将死掉的特定进程)

c++ - 从 C++ 生成 C 包装器?

java - 类包装器和 Java 与 Objective-C 中的单例有什么区别?

python - 如何将带有 .txt 扩展名的逗号 sep 值作为数组读取到 python 中?