设为首页 加入收藏

TOP

Python标准库logging模块代码分析
2014-11-24 08:10:19 来源: 作者: 【 】 浏览:1
Tags:Python 标准 logging 模块 代码 分析

问题1:如何获取caller的(文件名,行号,函数名)?


当新增一条log记录时,最终将调用Logger类的_log方法,这个方法首先会创建一个LogRecord对象。LogRecord对象需要(filename, lineno, funcname)参数信息。这是通过如下语句得到的:


fn, lno, func = self.findCaller()


findCaller内容如下:


f = currentframe() #f是frame对象,每个方法调用生成一个frame对象,放在程序堆栈中。
if f is not None:
f = f.f_back
rv = "(unknown file)", 0, "(unknown function)"
while hasattr(f, "f_code"):
co = f.f_code #获取code对象,它包含filename属性,funcname属性
filename = os.path.normcase(co.co_filename)
if filename == _srcfile: #_srcfile是这个模块文件自己的文件名,当文件名不再相同时
f = f.f_back # 得到外部调用者的frame,这就是需要的。
continue
rv = (filename, f.f_lineno, co.co_name)
break
return rv


currentframe函数的定义:


def currentframe():
"""Return the frame object for the caller's stack frame."""
try:
raise Exception #抛出异常,将生成traceback对象,其中包含frame对象。
except:
#sys.exc_traceback.tb_frame当前的frame, f_back调用着的frame
return sys.exc_traceback.tb_frame.f_back
#sys._getframe(3)返回的并不是当前的frame,3应该是计算好了的,减少循环的次数,返回的是logger.error()的frame
if hasattr(sys, '_getframe'): currentframe = lambda: sys._getframe(3)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android中webview和js之间的交互.. 下一篇Linux的IO复用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)
·MySQL下载与安装教程 (2025-12-26 13:21:26)
·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)