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

 韩大妖丫头 发布于 2022-11-05 20:06

logging.error是可以打印funcName的。具体应该是根据trace来做的。
现在我有这么个函数

def error(msg):
    logging.error(msg)
    sendEmail(msg)

我用这个函数代替了logging.error,这导致所有本来要输出funcName的地方,输出了error这个函数。原理我是理解的。就是因为栈帧的问题。但是有没有优雅的方式让我重新打出真正报错的函数?

2 个回答
  • 自己想了个不怎么优雅,但是也算是能用的方案

    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自己打的那个没什么用的行号/函数就留着不管了。

    2022-11-10 09:37 回答
  • 最暴力的方案:把 logging.currentframe 覆盖掉!但是其它使用 logging 的模块会出错。

    最靠谱的方案:使用自定义的 Logger 类,把其中的 findCaller 覆盖掉。其实只需要把代码复制过去,然后把 f = f.f_back 改成 f = getattr(f.f_back, 'f_back', None) 这样子就可以了。

    2022-11-10 09:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有