当我的数据库出现故障时,Sentry会立即被psycopg2 OperationalError: could not connect to server: Connection refused
淹没。由于OperationalError
可以在其他情况下抛出而不是无法访问的数据库,因此我无法使用RAVEN_CONFIG
IGNORE_EXCEPTIONS
盲目地忽略它。
我试着写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)
以下是我如何计算出来的(现在):
1 /使用Raven的配置过滤掉所有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,
},
},
}