Pythonのlogging二種類: RotatingFileHandlerとTimedRotatingFileHandler

Pythonのloggingモジュールにはたくさんのオプションがある。

この記事では、logging モジュールのログローテションの機能について解説していきます。Pythonには2種類のログローテションをサポートしています。

ログローテーションとは

ログローテーションとは、システムが残すログが際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きする操作のこと。 

  • サイズに基づいてログローテションさせる(RotatingFileHandler)
  • ある時間間隔に基づいてログを回転させる(TimedRotatingFileHandler)

これらの2種類のloggerがどのように実装され、使用されているか、いかに深掘ります。

RotatingFileHandler

LogingモジュールのRotatingFileHandlerクラスは、開発者がログのサイズに基づいてログローテションさせる機能を提供するlogging handler objectです。maxBytesパラメータを使って、ログを回転させるタイミングを指定することができます。つまり、ログが特定のバイト数に達すると、「rollover」されます。

これは、ファイルサイズを超えそうになったときに発生します。ハンドラーはファイルを閉じ、新しいファイルを静かに開きます。backupCountパラメータに数字を渡すと、ログファイルの最後に「.1」、「.2」などを追加してくれる。

handler = RotatingFileHandler(path, maxBytes=20,
                                  backupCount=5)

このコードを実行すると、オリジナルのtest.logと5つのバックアップ・ログの計6つのファイルができあがるはずです。

docs.python.org

TimedRotatingFileHandler

TimedRotatingFileHandlerは、開発者が時間の経過に基づいてログローテションを作成することができます。以下の時間条件でログローテションさせるように設定できます。

秒 (s) 分 (m) 時間 (h) 日 (d) w0~w6(平日、0=月曜 midnight

これらの条件を設定するには、2番目の引数であるwhenパラメータに渡すだけです。

handler = TimedRotatingFileHandler(
                                     path,
                                     when="m",
                                     interval=1,
                                     backupCount=5
                                     )

この例では、1分ごとにログを回転させ、バックアップカウントを5に設定しています。より現実的なローテーションは1時間ごとでしょうから、間隔を60にしたり、whenを「h」にしたりします。このコードが実行されると、6つのファイルが作成されますが、ログファイル名に整数を付加するのではなく、strftimeフォーマットの%Y-%m-%d_%H-%M-%Sを使ってタイムスタンプを付加します。