Djangoのマルチプロセスローリングログの問題

ログファイルのサイズRotatingFileHandlerコントロールを使用します

# settings.py
LOGGING = {
    ...
    'handlers': {
        ...
        'file': {
            'level': 'INFO',
            'class': 'logging.RotatingFileHandler',
            'filename': os.path.join(LOGS_DIR, 'app.log'),
            'formatter': 'verbose',
            'maxBytes': 1024,
            'backupCount': 5
        },
        ...
    }
    ...
}

MAXBYTESとbackupCountのRotatingFileHandler、デフォルトは0であるこれら2つのパラメータを設定します。

どちらのパラメータが0の場合、ralloverの手順を実行します:ログファイルのサイズがMAXBYTES、出力として新しいログファイルに近づくと、古いファイルは「0.1' 接尾辞のように追加された 『2』。

例えば、backupCount = 5場合、app.logとして定義されたファイル名をログに記録し、あなたはapp.log.5までapp.log、app.log.1、app.log.2を取得します。

しかし、ログが書き込まれapp.log.1が存在する場合、app.log.1同じ名前が最初にapp.log.2呼ばれる、常にapp.log、そして満たされたリネームapp.log.1ですように。

app.log.5が存在する場合また、それが削除されます。

Windows環境で発生する問題

PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

まず第一に、Djangoはファイルの変更を検出するのに使用されるプロセス、デフォルトでは二つのプロセスを有効にし、別のプロセスは、まともなサーバ・プロセスです。このファイルは二回ロードされているサーバプロセスが最初に開始された場合、ログファイルは、二回開かれsettting.py、何かを間違って表示されません。監視プロセスはそれほど深刻、settings.pyからログをロードするために最初にオンになっている場合サーバ・プロセスが再びログをロードすることができません。

あなたのDjangoプロジェクトが単一のプロセスである場合は、--noreloadを解決することができますDjangoプロジェクトの使用を開始するとき

python manage.py runserver 0.0.0.0:80 --noreload

noreloadは、メモリ内のコードのプロジェクトコードには影響しません、その変更がロードされ、その後、Djangoは唯一の起動プロセスになります彼らは監視プロセスジャンゴを開始していないと述べました。

プロジェクトは、マルチプロセスである、またはただし、このようなORMジャンゴを使用するために、セロリなど、いくつかの個々のモジュール、中)(django.setup使用されています

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
import django
django.setup()

その後、我々は別のログモジュールで対処する必要があります

pip install concurrent-log-handler

LOGGINGで使用するconcurrent_log_handler.ConcurrentRotatingFileHandler代わりに、logging.RotatingFileHandler

# settings.py
LOGGING = {
    ...
    'handlers': {
        ...
        'file': {
            'level': 'INFO',
            'class': 'concurrent_log_handler.ConcurrentRotatingFileHandler',
            'filename': os.path.join(LOGS_DIR, 'app.log'),
            'formatter': 'verbose',
            'maxBytes': 1024,
            'backupCount': 5
        },
        ...
    }
    ...
}

テスト、問題解決

プロセスは、マルチDjangoのLinuxシステムである場合に加えて、モジュールはConcurrentLogHandler使用することができます

pip install ConcurrentLogHandler
# settings.py
LOGGING = {
    ...
    'handlers': {
        ...
        'file': {
            'level': 'INFO',
            'class': 'cloghandler.ConcurrentRotatingFileHandler',
            'filename': os.path.join(LOGS_DIR, 'app.log'),
            'formatter': 'verbose',
            'maxBytes': 1024,
            'backupCount': 5
        },
        ...
    }
    ...
}

おすすめ

転載: www.cnblogs.com/luozx207/p/10986397.html