※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


Django2:ログのローテーションの方法について解説

python3 ログ logging Django

投稿日:2020年1月16日

このエントリーをはてなブックマークに追加
pythonではloggingモジュールの設定を適切に行うことで、簡単にログのローテーションを実装することができます。この記事ではDjangoでのログのローテーションの実装方法について解説します。

はじめに

Djangoでは設定ファイルでlogの設定をすることで簡単にログのローテーションを実装することができます。


実装方法を解説

Djangoにおけるlogの設定

Djangoは設定ファイルのLOGGINGでloggingモジュールの設定を管理しています。LOGGINGで設定する際にはdictConfigの形式で記述します。

RotatingFileHandler

DjangoではloggingのハンドラとしてRotatingFileHandlerを使うことで、ログファイルのサイズベースのローテーションを実装できます。Djangoの設定ファイルでは以下の様に設定します。

settings.py
[...]

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters':{
        'standard':{
            'format' : "standard_log [%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'file': {   # ログのローテーションの設定
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'debug.log',
            'maxBytes': 50000,
            'backupCount':2,
            'formatter':'standard',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file',],
            'level': 'DEBUG',
            'propagate': True,
        }
    },
}

[...]

formatterやloggerの説明はここでは割愛します。ここではfileという名前でRotatingFileHandlerのハンドラを定義しています。
それぞれの設定は以下の様な意味を持ちます。

  • level:ここで設定したログレベル以上のログを処理します。
  • filename:ログを出力する先のファイル名になります。
  • maxBytes:ログのローテーションする頻度の基準となるファイルサイズです。デフォルト値は0で、その場合はログのローテーションは行われません。
  • backupCount:ログのローテーションによるバックアップの作成数です。バックアップファイルはfilenameで指定したファイル名を基準に作成されます。例えば、filenameをdebug.logとし、backupCountを2とした場合、バックアップファイルはdebug.log.1、debug.log.2が作成されます。default値は0で、その場合にはログのローテーションは行われません。
  • formatter:どのformatterを使うのかを指定します。

▲ログのローテーションのイメージ図

まずfilenameで指定したファイル(今回はdebug.log)にログがどんどん格納されていきます。ログを格納しようとした時、ログファイルのサイズがmaxBytesで指定したサイズ(今回は50000byte)を超えそうになったら、そのログファイルの名前をdebug.log.1に変更して、新たに空のdebug.logを作成しそこにログを格納します。このバックアップファイルの最大数はbackupCountで指定した数まで(今回は2)で、すでにその数存在していた場合、最も古いバックアップファイルが更新されます。

TimedRotatingFileHandler

handlerとしてTimedRotatingFileHandlerを使うことで時間ベースのログのローテーションを実装することができます。Djangoの設定ファイルでは以下の様に記述します。

settings.py
[...]

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters':{
        'standard':{
            'format' : "standard_log [%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
              'file':{
            'level':'INFO',
            'class':'logging.handlers.TimedRotatingFileHandler',
            'filename':'debug.log',
            'when':'D',
            'interval':1,
            'backupCount':2,
            'delay':False
    },
    'loggers': {
        'django': {
            'handlers': ['file',],
            'level': 'DEBUG',
            'propagate': True,
        }
    },
}

[...]
  • level:ここで設定したログレベル以上のログを処理します。
  • filename:ログを出力する先のファイル名になります。
  • when : ローテーションの基準になる時間単位を指定します。(S:秒、M:分、H:時、D:日、W0〜W6W0を月曜日とした週、midnight:atTimeで指定した時間)
  • interval:whenで指定した時間単位を基準にインターバルを決めます。例えば今回の様にwhenをD、intervalを1にしたときには1日ごとにローテーションが行われます。
  • backupCount:ログのローテーションによるバックアップの作成数です。バックアップファイルはfilenameで指定したファイル名を基準に作成されます。例えば、filenameをdebug.logとし、backupCountを2とした場合、バックアップファイルはdebug.log.1、debug.log.2が作成されます。default値は0で、その場合にはログのローテーションは行われません。
  • delay:Trueの場合、ファイルを開くのは emit() の最初の呼び出しまで延期されます。

さいごに

まとめ

Djangoのloggingの設定はsettings.pyのLOGGINGで設定します。
ログを定期的にどこかのストレージに送ったりする場合には、今回紹介した方法のTimedRotatingFileHandlerを使うのが良いでしょう。

pythonのloggingには他にもいろんなハンドラがあるので興味があればみてみてください。


参考書籍

このエントリーをはてなブックマークに追加


関連記事

記事へのコメント