哨兵没有在logger.exception()的web UI中显示异常



在我们的flask应用程序中,Sentry在web UI中为未捕获的异常显示异常WITH堆栈跟踪,如:

a = 1/0

然而,在使用记录器捕获的异常中,如下所示:

try:
1/0
except Exception as e:
logger.exception('OH NOS occured: ')

sentry UI只显示记录的消息,没有堆栈跟踪。

关于Sentry最佳实践(在python中也是如此):

  • 捕获的异常是否需要信息/警告/错误日志下面的raven.client.captureException()
  • 是否应改用`logger.error('msg',exc_info=True)

查看正在发送的JSON"sentry.interfaces.Exception"甚至不是JSON主体的一部分,但它仍然发送要记录的消息。

附加信息(2017年10月27日):

文件结构设置:

flask_app/
|--app
|--utils

在日志配置dict中,应用程序和utils记录器都包含一个定义为sentry的处理程序。这就是它变得有趣的地方。在文件utils.crasher中,我有:

import logging
logger = getLogger(__name__)
def crash_boy():
try:
1 + '123'
except Exception as e:
logger.exception('Oh gosh we messed up big time here')
raise e

和在app.main 中

@bp.route('/crash')
def crash():
try:
return crash_boy()
except Exception as e:
logger.exception('OH GREAT')
return 'WE HAD A CRASH BOIZ'

Sentry将显示utils记录器的异常消息和堆栈跟踪,但应用程序记录器将仅记录错误消息(OH GREAT)。

默认情况下,Python日志记录不会捕获堆栈跟踪。

根据logging文件:

第二个可选关键字参数是stack_info,默认为False。如果为true,则会将堆栈信息添加到日志记录消息中,包括实际的日志记录调用。

改为尝试:

logger.exception('OH NOS occured: ', stack_info=True)

是否需要"手动"调用raven.client.captureException()?这取决于您如何配置它,但如果您使用了Flask的推荐实现(如本文所述),则不:

配置Sentry应用程序后,它将自动捕获Flask中未捕获的异常。

最新更新