はじめに
プログラムの実行中に発生するログを、時間経過で自動的にローテーションする方法を紹介します。ログファイルが大きくなりすぎないように、定期的に新しいファイルに切り替えることは、ログ管理において非常に重要です。今回は Python の logging モジュールを使い、時間経過に基づいたログローテーションの実装方法を解説します。
ログローテーションとは?
ログローテーションは、プログラムの実行中に記録されるログを、一定の基準で新しいファイルに切り替える技術です。時間経過(例:毎日、毎時)やファイルサイズの上限などでログを分割することができます。
ログローテーションの種類
ファイルサイズによるローテーション:指定されたファイルサイズを超えると、新しいログファイルを生成。 時間経過によるローテーション:指定された時間ごとに新しいログファイルを生成。 今回は、時間経過によるローテーションに焦点を当てて説明します。
必要なモジュール
Python 標準の logging モジュールに加え、TimedRotatingFileHandler を使用します。
import logging
from logging.handlers import TimedRotatingFileHandler
ログローテーションの設定
以下のコードは、1日ごとにログファイルがローテーションされる例です。
詳細は割愛しますが
# ロガーの設定
logger = logutil.setup_logging(log_dir)
def setup_logging(log_dir):
# 既存のハンドラーをクリア
logger = logging.getLogger(__name__)
logger.handlers.clear()
log_level_file = 'DEBUG'
detail_formatting = '%(asctime)s %(levelname)-8s [%(module)s# %(lineno)d] %(message)s'
# ログレベル設定
logger.setLevel(getattr(logging, log_level_file))
# ファイルローテーションハンドラー設定
file_handler = TimedRotatingFileHandler(
log_dir,
when='D',
interval=1,
backupCount=5,
encoding='utf-8'
)
file_formatter = logging.Formatter(detail_formatting)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
return logger
TimedRotatingFileHandler の引数
filename:ログファイルの名前。例:my_log.log
when:ローテーションの時間単位。midnight(深夜)、H(毎時)など。
interval:指定した時間単位の間隔。例:interval=1 と when="midnight" は1日ごと。
backupCount:古いログファイルを保持する数。
例:
backupCount=7 とすると過去7日分のログファイルが保存されます。
ローテーションのタイミング
when="midnight" を指定した場合、毎日深夜0時に新しいログファイルが作成されます。
ログファイルの命名ルール TimedRotatingFileHandler は、ローテーションしたファイルにタイムスタンプを追加します。例えば、my_log.log はローテーション時に
my_log.log.2023-09-06
という形式になります。
苦戦した箇所
もし誤って拡張子をつけてしまった場合、ログローテーションでファイル名に二重に拡張子が付いてしまうことがあります
(例:my_log.log.2023-09-06.log)。
拡張子をつけるとローテンションで削除されないことが発覚
ですので、ログのfile_nameは拡張子付けずに!!!