python - 我可以扩展 Logger 类而不更改记录的模块名称/函数名称/行号吗?

标签 python logging

我想避免编写像 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 方法,以向所有日志记录方法添加额外的值。

这避免了需要重写所有面向级别的日志记录方法(debuginfowarning 等),而且也很好地解决了-同时解决findCaller问题。

关于python - 我可以扩展 Logger 类而不更改记录的模块名称/函数名称/行号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53915421/

相关文章:

python - 从Python类中的另一个方法访问在一个方法内创建的变量

Oracle XE查询日志

logging - 如何将 Serilog 与 Amazon OpenSearch 结合使用?

c++ - boost 日志记录类属性

Java Logger 不轮换日志文件

python - 如何使用python在kafka消费者中创建聚合

python - 值错误 :invalid for int() with base 10: ''

python - 未知 PG 数字类型 25

python - 没有 pk 的休息框架 @detail_route

logging - Groovy 脚本和 log4j