hotch-potch, Note to self

いろいろ作業記録

標準出力を世代管理されたログに出力(rotatelogs.exe活用)

1.はじめに

Windows向けに作成したコンソールアプリで、動作状況を標準出力に常に出力する仕様のものがあるとします。 標準出力の内容をログファイルに書き出すのは、リダイレクトするだけでよいのですが、次々に内容が追記されて容量が無限に増える恐れがあります。

ここでは、リダイレクトだけでは管理しきれない制御を、rotatelogs.exeコマンドを使って、世代管理やローテーションする手順を解説します。

2.rotatelogs.exe コマンドの入手

rotatelogs.exeは、Apache に付属しています。

ZIPファイルを展開して、/Apache24/bin/ディレクトリからrotatelogs.exeを取り出します。

3.実験

ここでは、とあるディレクトリのなかに、hoge.logrotatelogs.exeを置いたものとします。

catコマンドでhoge.logの内容を標準出力に表示して、パイプを通じてrotatelogs.exeに渡します。

コマンドの例

cat hoge.log | rotatelogs.exe access.log 86400 540
引数の例 意味 補足
access.log 出力先のファイル名 相対・絶対パス指定OK
86400 どれだけの期間ごとに、ログファイルを分けるのか指定(単位:秒) 例:1日ごとに分ける→60(秒)×60(分)×24(時間)=86400
540 UTCとの時差(単位:分) 例:日本(UTC+9)→9(時間)x60(分)=540

実験

Windowsターミナルで実行してみます。

実行前

> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
------        2023/08/18     19:12          12903 hoge.log
------        2023/01/16      3:16          68608 rotatelogs.exe

実行

> cat .\hoge.log | .\rotatelogs.exe access.log 86400 540

実行後

access.log.1692576000というファイルができています。

> ls

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
------        2023/08/18     19:12          12903 hoge.log
------        2023/01/16      3:16          68608 rotatelogs.exe
------        2023/08/18     19:25           8557 access.log.1692576000

実際の運用での考え方

実際の運用では、先にログを取得する対象のコマンドを記述するので、下記のようになります。

myapp.exe | rotatelogs.exe access.log 86400 540

引数の与え方

やりたいこと 引数 補足
3世代までファイルを作る。それ以前のログは削除(ローテーション) ... | .\rotatelogs.exe -n 3 access.log 86400 540 -n Nを引数に与える
1MBytesを超えたら新しいログに移る ... | .\rotatelogs.exe access.log 1M 540 期間の秒の代わりに、容量B, K, M, G 単位を指定
ファイル名に年月日をつける ... | .\rotatelogs.exe access.%Y%m%d.log 86400 540
ファイル名に年月日時分秒をつける ... | .\rotatelogs.exe access.%Y%m%d%H%M%S.log 1 540 ログを分ける期間指定も1秒にしておくこと
ログの保存先ディレクトリを自動的に作成 ... | .\rotatelogs.exe -D log/access.log 86400 540 -Dをつけると、引数に指定のlogディレクトリがない状態でも、指定のディレクトリを作る。未指定だとエラー

参考資料