当我的数据库宕机时,Sentry立即被psycopg2的OperationalError: could not connect to server: Connection refused
淹没。由于OperationalError
可以在其他情况下抛出,而不是在不可访问的数据库中抛出,所以我不能使用RAVEN_CONFIG
的IGNORE_EXCEPTIONS
来盲目地忽略它。
我试图为Django日志编写一个过滤器,但它根本不起作用。它正确地拦截了异常,但仍然会使其冒出一些气泡。这是过滤器:
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
有一张关于过滤不适用于Raven的罚单,但它已经关闭。
你知道我该怎么解决这个问题吗?
以下是我(目前)的计算方法:
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,
},
},
}