Django:有没有办法过滤掉来自 mail_admins 日志处理程序的 503 'service unavilable' 响应?

Django: Is there a way to filter out 503 'service unavilable' responses from mail_admins log handler?

我为 Django LOGGING 配置了标准的“500 错误邮件管理员”:

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

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

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

实际上,我可以建议一个 hacky 方法。您可以创建一个继承 AdminEmailHandler class.

的 class
class CustomAdminEmailHandler(AdminEmailHandler):
    def send_mail(self, subject, message, *args, **kwargs):
        if 'service unavailable' in subject.lower(): # Not sure about the condition, you can find the correct one by debugging.
            super().send_email(subject, message, *args, **kwargs)

不要忘记在设置中将 mail_admins 的 class 更改为新的。

您可以在站点维护时设置 DEBUG=TRUE mode -- 我的意思是,它就在您的日志配置中。 卫生署!

仍然需要 mod 设置文件,然后记得 mod 在退出维护时将其恢复。有点 hacky,但在其他方面看起来很简单。

您可以简单地在 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,
        },
    },
}