在我的Python服务中,我使用的是内部构建的日志(log)记录库,它与Python的日志(log)记录模块不兼容.在使用这个库时,我想将其他信息添加到日志(log)中,如lineno和uncName.我一直在使用inspect图书馆来获取以下信息:

frame = inspect.currentframe().f_back
frame_info = inspect.getframeinfo(frame)
frame_info.lineno

然而,根据Python inspect.stack is slow中的讨论,这些使用inspect库的方法有些昂贵,因为它们访问文件系统.因此,我们注意到服务的性能下降(尽管没有我们之前使用inspect.stack()[0]时那么糟糕).

我注意到Python的原生日志(log)模块能够有效地获取funcName和lineno方法.它们通过LogRecord属性https://python.readthedocs.io/en/latest/library/logging.html#logrecord-attributes公开.

我的问题是,Python的日志(log)记录模块如何工作来高效地收集这些信息?我试图挖掘它的源代码,但很难找到合适的位置.

推荐答案

你不需要打一个完整的inspect.getframeinfo电话.检索Frame对象f_lineno及其代码对象co_name比检索inspect.getframeinfo的所有工作要便宜得多.

lineno = frame.f_lineno
funcname = frame.f_code.co_name

在我的计时中,这大约是使用inspect.getframeinfo的速度的inspect.getframeinfo倍.

Python相关问答推荐

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

对某些列的总数进行民意调查,但不单独列出每列

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

基于索引值的Pandas DataFrame条件填充

如何从pandas的rame类继承并使用filepath实例化

对象的`__call__`方法的setattr在Python中不起作用'

多指标不同顺序串联大Pandas 模型

在单个对象中解析多个Python数据帧

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

在两极中过滤

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

计算空值

将CSS链接到HTML文件的问题

如何在验证文本列表时使正则表达式无序?

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

操作布尔值的Series时出现索引问题

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

如何在Python中实现高效地支持字典和堆操作的缓存?

如何通过特定导入在类中执行Python代码

保存由PYTHON在EXCEL中所做更改的问题