投稿日:2020年1月16日
pythonではloggingモジュールの設定を適切に行うことで、簡単にログのローテーションを実装することができます。この記事ではDjangoでのログのローテーションの実装方法について解説します。
Djangoでは設定ファイルでlogの設定をすることで簡単にログのローテーションを実装することができます。
Djangoは設定ファイルのLOGGINGでloggingモジュールの設定を管理しています。LOGGINGで設定する際にはdictConfigの形式で記述します。
DjangoではloggingのハンドラとしてRotatingFileHandlerを使うことで、ログファイルのサイズベースのローテーションを実装できます。Djangoの設定ファイルでは以下の様に設定します。
[...]
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のハンドラを定義しています。
それぞれの設定は以下の様な意味を持ちます。
まずfilenameで指定したファイル(今回はdebug.log)にログがどんどん格納されていきます。ログを格納しようとした時、ログファイルのサイズがmaxBytesで指定したサイズ(今回は50000byte)を超えそうになったら、そのログファイルの名前をdebug.log.1に変更して、新たに空のdebug.logを作成しそこにログを格納します。このバックアップファイルの最大数はbackupCountで指定した数まで(今回は2)で、すでにその数存在していた場合、最も古いバックアップファイルが更新されます。
handlerとしてTimedRotatingFileHandlerを使うことで時間ベースのログのローテーションを実装することができます。Djangoの設定ファイルでは以下の様に記述します。
[...]
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,
}
},
}
[...]
Djangoのloggingの設定はsettings.pyのLOGGINGで設定します。
ログを定期的にどこかのストレージに送ったりする場合には、今回紹介した方法のTimedRotatingFileHandlerを使うのが良いでしょう。
pythonのloggingには他にもいろんなハンドラがあるので興味があればみてみてください。