◀ 10.

djangoにおけるログのローテート設定【Python】

▶
この記事の要点
  • Django のログローテートは settings.py の LOGGING → handlers の class を差し替えるだけ(Python 標準の logging.handlers を使う)
  • 日付で切り替え: TimedRotatingFileHandler(when・interval・backupCount)
  • サイズで切り替え: RotatingFileHandler(maxBytes・backupCount)
  • 'when': 'D' は「起動から 24 時間ごと」、日付の変わり目で切り替えたいなら 'midnight'
  • gunicorn 等で複数プロセスから同じファイルに書く場合、Python 側のローテートは競合する。logrotate + WatchedFileHandler が安全

結論: handlers の class をローテート対応に変える

ログの基本設定はこちらを参照してください。基本設定で logging.FileHandler を使っている部分を、以下のように handlers の中身を変更すると、ログファイルが日ごとに切り替わり、古いものは自動で削除されます。

    'handlers': {
        'normal': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'django.log'),
            'formatter': 'normal',
            'when': 'D',  # 単位 Dは日
            'interval': 1,  # 何日おきか指定
            'backupCount': 30,  # バックアップ世代数
        },
    },

Django の LOGGING 設定は Python 標準の logging.config.dictConfig 形式です。class 以外のキー(when など)は、そのままハンドラクラスのコンストラクタ引数として渡されます。

settings.py の全体例

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
LOG_DIR = os.path.join(BASE_DIR, 'logs')
os.makedirs(LOG_DIR, exist_ok=True)   # フォルダが無いと起動時にエラー

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'normal': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
        },
    },
    'handlers': {
        'normal': {
            'level': 'INFO',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'django.log'),
            'formatter': 'normal',
            'when': 'midnight',
            'backupCount': 30,
            'encoding': 'utf-8',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['normal'],
            'level': 'INFO',
        },
        'myapp': {
            'handlers': ['normal'],
            'level': 'DEBUG',
        },
    },
}

アプリのコードからは logger = logging.getLogger('myapp') のように、loggers に登録した名前でロガーを取得して使います。日本語を出力するなら encoding を指定しておくと文字化けを防げます。

TimedRotatingFileHandler の主なパラメータ

パラメータ意味例
when切り替えの単位。S(秒)/ M(分)/ H(時)/ D(日)/ midnight(深夜 0 時)/ W0〜W6(曜日、W0 が月曜)'midnight'
intervalwhen の何単位ごとに切り替えるか(W0〜W6 では無視)1
backupCount残す古いファイルの数。超えた分は削除。0 なら削除しない30
utcTrue なら UTC 基準で時刻を判定False
encodingファイルの文字コード'utf-8'

切り替え後の古いファイルは django.log.2026-10-02 のように日付の接尾辞付きで保存されます。

'D' と 'midnight' の違い: 'D' はプロセス起動時(またはファイルの最終更新時刻)から 24 時間ごとに切り替わるため、切り替わる時刻が日付の境目とずれます。「1 ファイル = 1 日分」にしたいなら 'midnight' を使います。

サイズでローテートする場合

        'size_rotate': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'django.log'),
            'formatter': 'normal',
            'maxBytes': 10 * 1024 * 1024,  # 10MB を超えたら切り替え
            'backupCount': 5,              # django.log.1 〜 .5 を保持
            'encoding': 'utf-8',
        },

ディスク容量の上限を確実に抑えたい場合はサイズ基準、日付単位で調査したい場合は時間基準が向いています。

落とし穴

  • 複数プロセスでの競合: gunicorn や uWSGI でワーカーを複数起動すると、各プロセスが別々にローテートを試み、ログが欠けたり別ファイルに書き続けたりする。本番では OS の logrotate に任せ、Django 側は logging.handlers.WatchedFileHandler(ファイルが差し替えられたら開き直す)を使うのが定番
  • runserver の自動リロード: 開発サーバーは監視用と実行用の 2 プロセスで動くため、Windows ではローテート時に「別のプロセスが使用中」の PermissionError が出ることがある。開発中は FileHandler にするか --noreload を付ける
  • ローテートはログ出力のタイミングで行われる: 深夜にログが 1 行も出なければ、次に出力された時点で切り替わる
  • ログフォルダの権限: 本番で Web サーバーの実行ユーザーに書き込み権限がないと起動に失敗する

確認方法

  1. 動作確認用に一時的に 'when': 'M'(1 分ごと)にしてサーバーを起動する
  2. 1 分以上空けて何度かアクセスし、logs フォルダに日時付きのファイルが増えることを確認する
  3. backupCount を小さくして、古いファイルが削除されることも確認する
  4. 確認後、when を本来の値に戻す

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成