python - 我可以在不更改记录的模块名称/函数名称/行号的情况下扩展 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)
;即它们总是相同的值。如果我尝试用装饰器实现类似的东西,我也会遇到同样的问题。
我知道这是由于在此文件中调用findCaller
in : https ://github.com/python/cpython/blob/2.7/Lib/logging/init .py ( R.1284 )。是否可以在基本上不复制粘贴 Logger 的实现并稍微调整它的情况下记录这些额外的数据?_log
解决方案
这似乎是存在的确切目的LoggerAdapter
:
LoggerAdapter
实例用于方便地将上下文信息传递到日志调用中。
您甚至可能不需要子类化任何东西,只需LoggerAdapter
直接使用:
logger = logging.getLogger(__name__)
logger = logging.LoggerAdapter(logger, extra={'extra_key': 'extra_value'})
如果您想动态提供额外的值,您可以轻松地继承LoggerAdapter
并覆盖其process
方法以向所有日志记录方法添加额外的值。
这避免了需要覆盖所有面向级别的日志记录方法(debug
、info
、warning
等),同时也很好地回避了这个findCaller
问题。
推荐阅读
- javascript - 从状态中删除对象会删除父对象的键
- ios - 如何从 UICollectionView 的外部数据源获取单元格标题
- reactjs - 如何从firebase实时数据库中获取平均值
- c# - 尝试访问另一个winform的按钮时如何修复实例?
- spring - 为什么spring boot不按顺序加载bean配置?
- traefik - Traefik 内部流量
- javascript - javascript中png文件的客户端验证
- objective-c - 为什么 NSTimer 每 5 秒而不是每 60 秒发送一次位置?
- python-3.x - 使用硒并写入文件时出错
- python - pynput模块右键不工作?