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 ディレクトリがない状態でも、指定のディレクトリを作る。未指定だとエラー |