毎分数千のリクエストを処理する Web サイトがあり、コードにエラーがある場合に備えて、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,},},
}
ヘルプやヒントをいただければ幸いです。:-) メリークリスマス!