为了账号安全,请及时绑定邮箱和手机立即绑定

如何优雅的解logging.error打印funcName的问题?

如何优雅的解logging.error打印funcName的问题?

Helenr 2019-04-13 08:36:41
logging.error是可以打印funcName的。具体应该是根据trace来做的。现在我有这么个函数deferror(msg):logging.error(msg)sendEmail(msg)我用这个函数代替了logging.error,这导致所有本来要输出funcName的地方,输出了error这个函数。原理我是理解的。就是因为栈帧的问题。但是有没有优雅的方式让我重新打出真正报错的函数?
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

最暴力的方案:把logging.currentframe覆盖掉!但是其它使用logging的模块会出错。
最靠谱的方案:使用自定义的Logger类,把其中的findCaller覆盖掉。其实只需要把代码复制过去,然后把f=f.f_back改成f=getattr(f.f_back,'f_back',None)这样子就可以了。
                            
查看完整回答
反对 回复 2019-04-13
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

自己想了个不怎么优雅,但是也算是能用的方案
deferror(msg):
stack_trace=traceback.format_stack(inspect.currentframe())
caller_lineno=stack_trace[-2].split(",")[1]#-1iserror()self,-2iscaller
logging.error(caller_lineno+""+msg)#这里用了行号来举例
sendEmail(msg)
利用和logging打行号/函数一样的原理把行号打了出来,对于logging自己打的那个没什么用的行号/函数就留着不管了。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 489 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信