web-dev-qa-db-ja.com

無効にする適切なログ設定Djangoエラーメール

私の環境で歩哨が動作するようになり、ログを微調整してエラーメールの送信を停止しようとしましたが、それでも動作し、理由がわかりません。私のログ設定は:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": '%(levelname)s %(asctime)s (%(pathname)s %(funcName)s): "%(message)s"'
        },
        "simple": {"format": "%(levelname)s %(message)s"},
        "Django.server": {
            "()": "Django.utils.log.ServerFormatter",
            "format": "[%(server_time)s] %(message)s",
        },
    },
    "handlers": {
        "null": {"level": "DEBUG", "class": "logging.NullHandler",},
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "simple",
        },
        "log_file": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": "/var/log/courtlistener/Django.log",
            "maxBytes": "16777216",  # 16 megabytes
            "formatter": "verbose",
        },
        "Django.server": {
            "level": "INFO",
            "class": "logging.StreamHandler",
            "formatter": "Django.server",
        },
    },
    "loggers": {
        # Disable SuspiciousOperation.DisallowedHost exception ("Invalid
        # HTTP_Host" header messages.) This appears to be caused by clients that
        # don't support SNI, and which are browsing to other domains on the
        # server. The most relevant bad client is the googlebot.
        "Django.security.DisallowedHost": {
            "handlers": ["null"],
            "propagate": False,
        },
        "Django.server": {
            "handlers": ["Django.server"],
            "level": "INFO",
            "propagate": False,
        },
        # This is the one that's used practically everywhere in the code.
        "cl": {"handlers": ["log_file"], "level": "INFO", "propagate": True,},
    },
}

ここに欠けている部分はありますか?どのようにしてメールが送信されるかはわかりません。考慮すべき別の構成変数はありますか?

[〜#〜] update [〜#〜]:私が気づいたことの1つは、plaintextエラーメールを受け取ることです今私が使っていたHTMLのものの代わりに。これはロギング設定を微調整したときに変更されましたが、なぜそれをググリングしても何も明らかにならないようです。

4
mlissner

あなたのLOGGING設定は私にはよく見えます(ほとんど、最後を参照してください)。他にも考えられることがいくつかあります。

変更を加えた可能性がありますが、すべての場所ではありません。他のアプリ、セロリプロセス、ステージングデプロイなどを、忘れていた場所で実行している可能性があります。

おそらく別の何か(何なのかわからない...)がこのロギングハンドラーを構成しています。この場合は、既存のロガーを無効にすることができます。

LOGGING = {
    "disable_existing_loggers": True,
    ...
}

これはあまり良い考えではありませんが、他の人のロガーを無効にするので、別の方法で無効にすることができます。

ADMINS設定は、エラーの送信先の電子メールアドレスを定義するので、これを空のリストに設定するだけで無効にすることができます。

ADMINS = []

エラーメールの送信のみがこの設定に使用されるため、これは比較的安全です。ユーザーまたはサードパーティのアプリが使用している場合を除きます。

サーバーエラーではなく404エラーのメールを送信することもできます。 MIDDLEWAREBrokenLinkEmailsMiddlewareが含まれていないことを確認してください。これにはADMINSにも同様の設定がありますが、これはMANAGERSと呼ばれます。

MANAGERS = []

独自のLOGGING dictを作成するときに何かを見逃していないことを確認するために default logging config も確認する必要があります。

もう1つ気づいたのは、LOGGINGの構成をプロジェクトに接続すると、maxBytesの値が整数ではなく整数になるため、構成が正しく解析されないことです。ストリング。だからあなたも変更してみることができます:

"log_file": {
    "level": "DEBUG",
    "class": "logging.handlers.RotatingFileHandler",
    "filename": "/var/log/courtlistener/Django.log",
    "maxBytes": "16777216",  # 16 megabytes
    "formatter": "verbose",
}

に:

"log_file": {
    "level": "DEBUG",
    "class": "logging.handlers.RotatingFileHandler",
    "filename": "/var/log/courtlistener/Django.log",
    "maxBytes": 16777216,  # 16 megabytes
    "formatter": "verbose",
}
1
Tom Carrick