你如何引发python异常并为Sentry包含额外的数据?

时间:2013-04-11 14:16:02

标签: python django exception sentry

Sentry可以检测与异常相关的其他数据,例如:

enter image description here

如何使用自己的additional data字段从Python(它是一个Django应用程序)中引发这样的异常?

5 个答案:

答案 0 :(得分:9)

我使用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()不接受使用extra参数所需的kwargs。

这些值将显示在Sentry Error仪表板的“附加数据”部分中。

答案 1 :(得分:4)

wes' answer没有帮助我,因为我想实际提高例外,不仅记录它。

这就是我所做的(client是Raven Sentry客户端):

client.extra_context({'foo': 'bar'})
raise RuntimeError('Whoops, something went wrong!')

答案 2 :(得分:1)

您可以尝试以下两种方法之一:

>>> # 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
>>> 

您可以通过添加更多参数来添加任意数量的其他数据字段。

答案 3 :(得分:1)

Sentry handler在捕获异常消息时会在屏幕截图中添加该信息,并从 traceback 中获取该信息,而不是异常本身。

您可以通过将额外的关键字参数传递给.capture()来添加额外字段;例如,如果您传入request对象,则Django client会为您执行此操作。

目前,没有其他数据来自例外。您必须自己扩展异常处理以添加此类工具。

答案 4 :(得分:0)

现有的答案都没有很好地用于我的确切用例(这是从django Request对象添加额外的上下文到哨兵数据中)。在进行了一些挖掘之后,使用SENTRY_CLIENT setting覆盖客户端后,最终工作得很好。

这是一个完整的简单用例:

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'