3

我编写了一个包装记录器类,它将 的返回值保存self.logger=getLogger(...)在一个属性中,并相应地调用记录请求(self.logger.info(...))。在处理程序格式中,我使用标签%(module)s%(lineno)d打印模块名称和行号。不幸的是,我只在行号中获取包装模块名称,因为这是对日志系统的最终调用发生的地方。

你知道如何用它的模块名称和行号来报告调用包装器的函数吗?

4

2 回答 2

2

虽然我同意使用所描述的包装器有点傻,但我自己解决了这个问题,因为当使用 lambda 包装在“附加”中具有相似、长且烦人的参数的调用时。在其他地方没有找到好的答案,我想我会分享。

(这是一个 Python 3.2.3 解决方案。同样,它特定于 lambda 包装器而不是类包装器。)

第一步:查找 Python 源代码,找到 ..Lib\logging\__init__.py,
步骤 b:找到“Logger.findCaller”方法,将其复制到某个实用程序文件中,重命名为“find_caller_no_lambda”。
下一步:从方法签名中删除“self”,为任何模块级属性添加前缀,并进行以下更改,修改为口味:

#       if filename == _srcfile: # Original line
        if filename == logging._srcfile or f.f_code.co_name == "<lambda>": # New line
            f = f.f_back # Original line for context.
            continue # Original line for context.

最后一步:在声明记录器的任何位置,插入以下行:

my_logger.findCaller = util.find_caller_no_lambda

瞧。

(当然,如果你愿意的话,你可以将 Logger 子类化为一个小小的改变。)

附录:

相反,您可以重写 Logger.makeRecord 以删除对附加项中的键冲突的检查,并将行号、函数名称等添加到日志调用本身/在包装器中检测此类内容。

于 2012-11-27T18:59:54.917 回答
0

它在 Python Frame 对象中。http://docs.python.org/library/inspect.html

于 2012-04-05T11:04:06.193 回答