3

毎分数千のリクエストを処理する 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,},},
}

ヘルプやヒントをいただければ幸いです。:-) メリークリスマス!

4

1 に答える 1

3

実稼働環境で同じアプリケーションの複数のインスタンスを実行している可能性があります (インスタンスごとに制限が機能すると思います)。

私の経験では、 sentryのようなログ集計ツールは、電子メールでエラーを受け取るよりもはるかに優れているため、問題の原因を追跡する価値はありません。セントリーをインストールするだけで満足です。

于 2012-12-24T03:34:58.447 に答える