在我们的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中未捕获的异常。