logging.error是可以打印funcName的。具体应该是根据trace来做的。
现在我有这么个函数
def error(msg):
logging.error(msg)
sendEmail(msg)
我用这个函数代替了logging.error,这导致所有本来要输出funcName的地方,输出了error这个函数。原理我是理解的。就是因为栈帧的问题。但是有没有优雅的方式让我重新打出真正报错的函数?
logging.error是可以打印funcName的。具体应该是根据trace来做的。
现在我有这么个函数
def error(msg):
logging.error(msg)
sendEmail(msg)
我用这个函数代替了logging.error,这导致所有本来要输出funcName的地方,输出了error这个函数。原理我是理解的。就是因为栈帧的问题。但是有没有优雅的方式让我重新打出真正报错的函数?
自己想了个不怎么优雅,但是也算是能用的方案
def error(msg):
stack_trace = traceback.format_stack(inspect.currentframe())
caller_lineno = stack_trace[-2].split(",")[1] # -1 is error() self, -2 is caller
logging.error(caller_lineno + " " + msg)#这里用了行号来举例
sendEmail(msg)
利用和logging打行号/函数一样的原理把行号打了出来,对于logging自己打的那个没什么用的行号/函数就留着不管了。
1 回答9.6k 阅读✓ 已解决
2 回答5.3k 阅读✓ 已解决
2 回答3.6k 阅读✓ 已解决
3 回答4.5k 阅读
3 回答1.4k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
最暴力的方案:把
logging.currentframe
覆盖掉!但是其它使用 logging 的模块会出错。最靠谱的方案:使用自定义的 Logger 类,把其中的
findCaller
覆盖掉。其实只需要把代码复制过去,然后把f = f.f_back
改成f = getattr(f.f_back, 'f_back', None)
这样子就可以了。