1.はじめに
Windows向けに作成したコンソールアプリで、動作状況を標準出力に常に出力する仕様のものがあるとします。 標準出力の内容をログファイルに書き出すのは、リダイレクトするだけでよいのですが、次々に内容が追記されて容量が無限に増える恐れがあります。
ここでは、リダイレクトだけでは管理しきれない制御を、rotatelogs.exeコマンドを使って、世代管理やローテーションする手順を解説します。
2.rotatelogs.exe コマンドの入手
rotatelogs.exeは、Apache に付属しています。
ZIPファイルを展開して、/Apache24/bin/ディレクトリからrotatelogs.exeを取り出します。

3.実験
ここでは、とあるディレクトリのなかに、hoge.logとrotatelogs.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ディレクトリがない状態でも、指定のディレクトリを作る。未指定だとエラー |