2013-04-11 31 views
9

哨兵可以檢測異常,如相關的其他數據:你如何提出python異常併爲Sentry添加其他數據?

enter image description here

你如何用自己的additional data領域提高在Python(這是一個Django應用程序)這樣的異常?

+0

'raise'採取任何類或實例。你能更清楚你在問什麼嗎? – 2013-04-11 14:17:58

+0

你想添加什麼額外的數據? – mgilson 2013-04-11 14:18:02

+0

offtopic - 但你的截圖從哪裏來?爲什麼我在django中沒有這麼漂亮的例外? - 編輯:對不起,這是哨兵。 – user1688936 2013-04-11 14:27:06

回答

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()不接受kwargs,這是使用extra參數所必需的。

這些值將顯示在Sentry Error儀表板的「其他數據」部分。

+0

就是這樣。如果您使用的是Raven客戶端,您可以:[「將它作爲您的額外子句中的數據傳遞]」(http://raven.readthedocs.org/en/latest/config/logging.html)'例如:logger.error( '有一些瘋狂的錯誤',exc_info = True,extra = {'data':{'username':request.user.username}})' – AJP 2013-10-25 12:25:45

+1

這並沒有真正回答這個問題。 'logger.error(...)'不會重新引發異常,所以它會吞下它並繼續。你會如何用額外的數據引發異常? – dAnjou 2015-04-29 12:37:20

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

,您可以根據需要添加更多的參數添加任意數量的數據字段。

1

Sentry handler在捕獲異常消息時在屏幕截圖中添加了該信息,並從回溯中獲取該信息,而不是異常本身。

您可以通過將額外的關鍵字參數傳遞給.capture()來添加額外的字段;例如,如果您通過request對象,則Django client會爲您提供幫助。

目前,沒有其他數據來自例外。您必須自己擴展異常處理才能添加這樣的工具。

1

wes' answer沒有幫助我,因爲我想實際加薪例外,不僅記錄它。

這裏就是我所做的(client是烏鴉衛士客戶端):

client.extra_context({'foo': 'bar'}) 
raise RuntimeError('Whoops, something went wrong!') 
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' 
相關問題