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,
},
},
}
我为 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.
的 classclass 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,
},
},
}