首页 > 解决方案 > Django:有没有办法从 mail_admins 日志处理程序中过滤掉 503 个“服务不可用”响应?

问题描述

我已经用标准的“邮件管理员 500 错误”配置了 django LOGGING:

'mail_admins': {
    'level': 'ERROR',
    'filters': ['require_debug_false'],
    'class': 'django.utils.log.AdminEmailHandler'
},

当我将站点置于维护模式(django-maintenance-mode)时,它会正确响应匿名请求的 503“服务不可用”。当站点处于维护模式时,这会导致向管理员发送大量电子邮件。我想“过滤掉 503 响应 IF 站点处于维护模式”以阻止洪水。但看不到一个简单的方法来做到这一点(例如,日志过滤器需要请求检查站点是否处于维护模式)

我知道我可以将维护错误代码更改为 400 级错误,但这似乎是非语义黑客。也可以在维护期间暂停管理员电子邮件,但这需要记住破解/恢复设置文件。希望有人有一个聪明的想法如何简单地实现这一点,没有黑客。

标签: djangologginghttp-status-code-503

解决方案


您可以简单地在 settings.py 的 LOGGING 中创建过滤器“ require_not_maintenance_mode_503 ”,然后在处理程序“ mail_admins ”中添加过滤器。这将防止在 503 错误时发送电子邮件。例如:

    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_not_maintenance_mode_503': {
            '()': 'maintenance_mode.logging.RequireNotMaintenanceMode503',
        },
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['require_not_maintenance_mode_503'],
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

推荐阅读