我想避免编写像 logger.debug(msg, extra=self.extra)
这样的代码。到目前为止,我尝试通过两种方式做到这一点(扩展 Logger 和装饰器),但都没有成功。
如果我扩展 Logger 类并实现调试等方法,如下所示:
def debug(self, msg, *args, **kwargs):
self._update_kwargs(**kwargs)
super(ExtendedLogger, self).debug(msg, *args, **kwargs)
记录的模块/函数名称/行号不是 ExtendedLogger.debug 的调用点,而是调用 super(ExtendedLogger, self).debug(msg, *args, **kwargs)
;即它们总是相同的值。如果我尝试使用装饰器实现类似的东西,我也会遇到同样的问题。
我知道这是由于在该文件的 _log
中调用 findCaller
造成的:https://github.com/python/cpython/blob/2.7/Lib/logging/init.py (R.1284)。是否可以记录这些额外的数据,而无需复制粘贴 Logger 的实现并稍微调整它?
最佳答案
这似乎正是 LoggerAdapter
的确切目的。存在:
LoggerAdapter
instances are used to conveniently pass contextual information into logging calls.
您甚至可能不需要子类化任何内容,只需直接使用 LoggerAdapter
即可:
logger = logging.getLogger(__name__)
logger = logging.LoggerAdapter(logger, extra={'extra_key': 'extra_value'})
如果您想动态提供额外的值,您可以轻松地继承 LoggerAdapter
并重写其 process
方法,以向所有日志记录方法添加额外的值。
这避免了需要重写所有面向级别的日志记录方法(debug
、info
、warning
等),而且也很好地解决了-同时解决findCaller
问题。
关于python - 我可以扩展 Logger 类而不更改记录的模块名称/函数名称/行号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53915421/