我们有一个网站,每分钟有几千个请求,我想限制Django发送给我们的错误管理邮件的最大数量,以防我们的代码出现错误。
在我的本地开发系统上,下面的日志配置工作得很好。它设置一个缓存值,该值将在10秒后过期。在此时间间隔内发生的错误根本不会报告。这就是我们想要的。
以下所有代码都放在我们的项目设置文件中。def limit_error_interval(record):
from django.core.cache import cache
if not cache.get('last_error'):
cache.set('last_error', '1', 10) # 10 sec
return True
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'error_limit': {
'()': 'django.utils.log.CallbackFilter',
'callback': limit_error_interval
},
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['error_limit',],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins',],
'level': 'ERROR',
'propagate': True
},
}
}
然而,代码在我们的生产服务器(NGINX)上失败了。Limit_error_interval被调用,但是每个错误仍然通过邮件发送。我们的缓存在代码中工作,但它似乎不在这个函数中工作。在设置中使用缓存是否有问题?这个替代方法/代码片段有完全相同的问题:在本地开发系统上工作,但不能在生产环境中工作。
class ErrorIntervalFilter(object):
def filter(self, record):
from django.core.cache import cache
if not cache.get('last_error'):
cache.set('last_error', '1', 10)
return True
LOGGING = {
'version': 1, 'disable_existing_loggers': False,
'handlers': {'mail_admins': {'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'filters': ['error_interval'],}},
'filters': {'error_interval': {'()': ErrorIntervalFilter,}},
'loggers': {'django.request':{'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': True,},},
}
任何帮助或提示感谢!圣诞快乐!
也许您正在生产环境中运行同一应用程序的多个实例(我猜每个实例都有限制)。
根据我的经验,像sentry这样的日志聚合工具比通过电子邮件接收错误要好得多,因此不值得追踪问题的原因。安装岗哨就好了