2014-09-18 6 views
0

데이터베이스가 다운되면 Sentry는 즉시 psycopg2의 OperationalError: could not connect to server: Connection refused에 넘칩니다. OperationalError은 도달 할 수없는 데이터베이스 이외의 다른 경우에 던져 질 수 있으므로 RAVEN_CONFIGIGNORE_EXCEPTIONS을 사용하여 맹목적으로 무시할 수는 없습니다.Rent가 Sentry에 대해 지정된 예외를 촬영하지 못하게합니다.

나는 a filter for Django logging을 쓰려고했지만 그냥 작동하지 않습니다. 예외를 올바르게 가로 채기는하지만 여전히 어딘가에 버블 링합니다. 다음은 필터입니다.

def skip_unreachable_database(record): 
    """Avoid flooding Sentry when the database is down""" 
    if record.exc_info: 
     print '>>>', record.exc_info 
     exc_type, exc_value = record.exc_info[:2] 
     if isinstance(exc_value, OperationalError) and exc_value.message.lower().startswith('could not connect to server: connection refused'): 
      return False 
    return True 

a ticket about filtering not working with Raven이 있지만 폐쇄되었습니다.

어떻게 해결할 수 있습니까? 나는 (지금은) 그것을 알아 낸 방법은 다음과

답변

0

은 다음과 같습니다

1/까마귀의 구성을 사용하여 모든 OperationalError를 필터링 :

RAVEN_CONFIG = { 
    # [...] 
    'IGNORE_EXCEPTIONS': [ 
     'OperationalError', 
    ], 
} 

2/이들을위한 전용 필터, 로거 및 로깅 파일을 추가 예외이므로 손실되지 않습니다.

def operational_errors_only(record): 
    """Only catch OperationalError exceptions""" 
    if record.exc_info: 
     exc_type, exc_value = record.exc_info[:2] 
     if isinstance(exc_value, OperationalError): 
      return True 
    return False 

LOGGING = { 
    # [...] 
    'filters': { 
     'operational_errors_only': { 
      '()': 'django.utils.log.CallbackFilter', 
      'callback': operational_errors_only, 
     }, 
    }, 
    'handlers': { 
     'operationalerrors': { 
      'mode': 'a', 
      'class': 'common_src.logutils.FallbackWatchedFileHandler', 
      'filename': '/path/to/operationalerrors.log', 
      'formatter': 'verbose', 
      'filters': ['operational_errors_only'], 
     }, 
    }, 
    'loggers': { 
     '': { 
      'handlers': ['console', 'sentry', 'operationalerrors'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    }, 
}