当前位置: 首页 > 后端技术 > Python

丰富你的日志信息:从Python调用栈获取行号等信息

时间:2023-03-25 22:37:38 Python

程序中打印日志,或者消息上传,比如kafka消息等。经常上传的消息需要上传文件名,行号,上层-levelcaller和其他用于在堆栈信息中定位的特定消息。Python提供了以下两个方法:sys._getframe,基本方法inspect.currentframe,推荐方法,除了sys._getframe方法外,还提供了更多frame相关的方法。具体用法如下_getframe私有方法的具体使用如下:importosimportsysdefget_cur_info():"""调用时获取上层调用者的文件名、行号、名称:return:文件名、行号、以及上层调用者的名称“””try:current_frame=sys._getframe(2)returnos.path.basename(current_frame.f_code.co_filename),current_frame.f_lineno,current_frame.f_code.co_nameexceptValueError:return'unknown',0,'unknown'具体函数输出结果演示请参考下面inspect模块的结果。使用inspect模块(推荐)相比sys自带的私有方法,更推荐使用inspect模块。inspect模块的具体用法如下importosimportinspectdefget_cur_info():try:current_frame=inspect.currentframe(2)returnos.path.basename(current_frame.f_code.co_filename),current_frame.f_lineno,current_frame.f_code.co_name除了:ValueErrorreturn'unknown',0,'unknown'defproduce():returnget_cur_info()defbusiness():returnproduce()if__name__=='__main__':print(get_cur_info())#output('unknown',0,'unknown')print(produce())#output('a.py',22,'')print(business())#output('a.py',16,'business')主要依赖inspect.currentframe方法,inspect.currentframe方法的使用见帮助文档>>>help(inspect.currentframe)模块sys:_getframe(...)内置函数_getframe的帮助_getframe([depth])->frameobject从调用堆栈返回一个帧对象。如果给出了可选的整数深度,则返回堆栈顶部下方许多调用的框架对象。如果那比调用堆栈更深k,引发ValueError。深度的默认值为零,返回调用堆栈顶部的帧。此功能应仅用于内部和专门用途。depth的默认值为零,默认为0,返回调用堆栈顶部的帧。如果指定的深度比调用堆栈更深,将抛出ValueError异常。此功能只能用于内部和专业目的。inspect.currentframe方法的实现可以在内置库中找到inspect.pyifhasattr(sys,'_getframe'):currentframe=sys._getframeelse:currentframe=lambda_=None:None所以本质上是inspect.currentframe方法相当于sys._getframe方法currentframe=lambda_=None:None相当于currentframe=lambda_:None,即lambda函数接收一个参数,返回None参考:PythonframehackStackOverFlow-在Python中,怎么做我获取当前帧?记得给我点个赞哦!对计算机各个方向的视频课程和电子书,从入门、进阶、实用进行了认真梳理,并按照目录进行合理分类。你总能找到你需要的学习资料。你在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,请点个赞,万分感谢。我是职场亮哥,四年工作经验的YY高级软件工程师,拒绝当领导的斜杠程序员。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!