首页 > 解决方案 > 我可以在不更改记录的模块名称/函数名称/行号的情况下扩展 Logger 类吗?

问题描述

我想避免编写像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);即它们总是相同的值。如果我尝试用装饰器实现类似的东西,我也会遇到同样的问题。

我知道这是由于在此文件中调用findCallerin : https ://github.com/python/cpython/blob/2.7/Lib/logging/init .py ( R.1284 )。是否可以在基本上不复制粘贴 Logger 的实现并稍微调整它的情况下记录这些额外的数据?_log

标签: pythonlogging

解决方案


这似乎是存在的确切目的LoggerAdapter

LoggerAdapter实例用于方便地将上下文信息传递到日志调用中。

您甚至可能不需要子类化任何东西,只需LoggerAdapter直接使用:

logger = logging.getLogger(__name__)
logger = logging.LoggerAdapter(logger, extra={'extra_key': 'extra_value'})

如果您想动态提供额外的值,您可以轻松地继承LoggerAdapter并覆盖其process方法以向所有日志记录方法添加额外的值。

这避免了需要覆盖所有面向级别的日志记录方法(debuginfowarning等),同时也很好地回避了这个findCaller问题。


推荐阅读