Sentry 可以检测与异常相关的其他数据,例如:
你如何用你自己的additional data
字段从 Python(它是一个 Django 应用程序)中引发这样的异常?
我使用库记录异常,logging
因此在稍微调试代码后,我注意到了extra
参数:
import logging
logger = logging.getLogger('my_app_name')
def do_something():
try:
#do some stuff here that might break
except Exception, e:
logger.error(e, exc_info=1, extra={'extra-data': 'blah', })
传递 exc_info=1 与调用logger.exception
. 但是,exception()
不接受使用参数所需的 kwargs extra
。
这些值将显示在 Sentry Error 仪表板的“附加数据”部分。
wes 的回答对我没有帮助,因为我想实际提出一个异常,而不仅仅是记录它。
这是我所做的(client
是 Raven Sentry 客户端):
client.extra_context({'foo': 'bar'})
raise RuntimeError('Whoops, something went wrong!')
您可以尝试以下两种方法之一:
>>> # Raise the exception with the data you want.
>>> raise Exception('extra information')
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
raise Exception('extra information')
Exception: extra information
>>> # Catch an exception and add extra arguments.
>>> try:
raise Exception()
except Exception as error:
error.args += ('extra information',)
raise
Traceback (most recent call last):
File "<pyshell#68>", line 2, in <module>
raise Exception()
Exception: extra information
>>>
您可以通过添加更多参数来添加任意数量的附加数据字段。
Sentry 处理程序在捕获异常消息时在您的屏幕截图中添加该信息,并从 traceback 获取该信息,而不是异常本身。
.capture()
您可以通过向;传递额外的关键字参数来添加额外的字段 例如,如果您传入对象,Django 客户端会为您执行此操作。request
目前,没有从异常中获取其他数据。您必须自己扩展异常处理才能添加这样的设施。
现有的答案都不能很好地满足我的确切用例(即从 djangoRequest
对象添加额外的上下文到哨兵数据中)。经过一番挖掘后,最终效果很好的是使用该SENTRY_CLIENT
设置覆盖了客户端。
这是一个完整的简单用例:
from raven.contrib.django.raven_compat import DjangoClient
class CustomSentryClient(DjangoClient):
def get_data_from_request(self, request):
result = super(EToolsSentryClient, self).get_data_from_request(request)
if getattr(request, 'custom_field', None):
if 'extra' not in result:
result['extra'] = {}
result['extra']['custom_field'] = request.custom_field
return result
然后settings.py
你只需添加
SENTRY_CLIENT = 'myapp.CustomSentryClient'