使用 logger.exception 抑制/重定向堆栈跟踪打印输出?

Suppress/redirect stack trace print out with logger.exception?

提问人:mike rodent 提问时间:4/16/2023 最后编辑:Vinay Sajipmike rodent 更新时间:4/18/2023 访问量:123

问:

处理异常的一个好方法是使用:Logger.exception

try:
    do_something()
except BaseException:
    logger.exception('some message')

...这不仅会打印出用户消息,还会打印出异常消息和异常类型,以及完整的堆栈跟踪。

我的记录器有两个处理程序:a 和 a .FileHandlerStreamHandler

使用 colorlog 根据不同的级别为我的记录器输出着色,我可以看到在上面的情况下,根据记录器打印了“一些消息”(我相信级别,即红色)......但堆栈跟踪本身是以普通的控制台颜色打印的。它可能是 ,但更有可能是 。logging.ERRORstdoutstderr

碰巧的是,我希望在这种情况下将此堆栈跟踪完整打印到我的记录器的文件处理程序中,而不是打印到处理控制台输出的流处理程序中:堆栈跟踪非常适合调试目的,但默认情况下,用户不应暴露于它们。

我查看了 StreamHandler 上的日志记录文档,但看不到抑制给定此类处理程序的堆栈跟踪打印输出的方法。

Python 异常 日志记录 堆栈跟踪 stderr

评论

0赞 roganjosh 4/16/2023
其中一部分已经存在; 将为您提供绑定到的异常消息,而无需回溯。至于如何以最干净的方式切换记录器,我不太确定except BaseException as e:e
0赞 mike rodent 4/16/2023
如果我理解的话,你是说使用和处理你自己的堆栈提取和报告。但关键是我想利用 ,它是为此目的而设计的。看一下模块源代码,但一如既往,它非常复杂。在控制台流处理程序中禁止显示堆栈跟踪是您希望能够执行的相当直观的事情。logger.errorlogger.exceptionlogging
0赞 roganjosh 4/16/2023
禁止显示堆栈跟踪是为您完成的,如果您只是记录 .您建议要记录错误而不是回溯,因此请使用异常级别/等进行记录。您在异常级别记录它的事实可能意味着无论如何您都会获得堆栈跟踪。这不是我的强项,但我不确定你能不能两全其美;如果您想要错误但没有回溯,并且为了让程序继续,您应该使用 ?except SomeException as e:eeINFOWARNlogging.exception
0赞 mike rodent 4/16/2023
啊,也许我没有充分澄清:我的记录器有两个处理程序,一个 StreamHandler(控制台输出)和一个 FileHandler(日志文件输出)。我希望堆栈跟踪记录在后者中,但不希望控制台前面的用户看到该堆栈跟踪。有明显的方法可以在不使用 的情况下做到这一点,但是如果可以抑制处理程序的堆栈跟踪输出,那么获得我想要的东西的一种优雅方法是。我对实现这一目标的子类相当乐观。logger.exceptionStreamHandler

答:

-1赞 Vinay Sajip 4/18/2023 #1

要禁止特定处理程序的堆栈跟踪,请将格式化程序附加到该处理程序,该处理程序返回堆栈跟踪的空字符串。请参阅我对另一个问题的相关答案 - 该答案将堆栈跟踪格式化为一行,但您应该能够扩展那里提出的想法。