我在自定义 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/