防止乌鸦射杀哨兵的特定例外



当我的数据库宕机时,Sentry立即被psycopg2的OperationalError: could not connect to server: Connection refused淹没。由于OperationalError可以在其他情况下抛出,而不是在不可访问的数据库中抛出,所以我不能使用RAVEN_CONFIGIGNORE_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,
        },
    },
}

相关内容

  • 没有找到相关文章

最新更新