rotetalogs:ログを指定した期間やサイズで別のファイルに分けて記録する
ログは同じファイルに記録を続けていきますが日数が経過するとファイルサイズも大きくなり必要な情報を探すのも面倒になります。 Apache で用意されている rotetalogs ツールを使用すると、指定した期間毎にログのファイルを分けてログを記録していくことができます。またログファイルの最大数を指定して、ログをローテーションさせることもできます。ここではログを指定期間毎に別のファイルに分ける rotetalogs ツールの使い方について解説します。
(Last modified: )
目次
rotetalogsツールの使い方
ログを一つのファイルではなく、設定した条件を満たすたびにファイルを分けて記録するためのツールとして rotetalogs ツールが用意されています。 Apache をインストールしたディレクトリの中の bin ディレクトリの中に含まれています。
使い方は次の通りです。
rotatelogs.exe ログファイル名 期間 UTCとのオフセット rotatelogs.exe ログファイル名 サイズ UTCとのオフセット
ログファイル名にはログを保存するファイルの名前を指定します。指定した期間または指定したサイズ毎にファイルが分けられるので、ログファイル名で指定したファイル名のあとに自動でサフィックスが付けられます。デフォルトでは「ログファイル名.経過時間」というファイル名になります。(経過時間は 1970/01/01 を開始日時とした場合の経過秒数です)。
期間はログをどれだけの期間毎にログファイルを分けるのかを秒単位で指定します。 1 日単位であれば 60(秒)×60(分)×24(時間)=86400 を指定します。また指定したサイズ毎に分割することもできます。サイズで指定する場合は単位として B / K / M /G のいずれかを指定します。例えば 10 MByte 毎に分割する場合は 10M を指定します。
UTC (協定世界時) とのオフセットは、 JST(日本標準時) との差を分単位で記載します。日本の場合は 9 時間なので 9(時間)x60(分)=540 を指定します。
実際の使い方ですが、 CustomLog ディレクティブまたは ErrorLog ディレクティブでログファイル名を指定する代わりに次のようにパイプ(|)を通して rotatelogs を記述します。
CustomLog "|bin/rotatelogs.exe ログファイル名 期間 オフセット" フォーマット名 ErrorLog "|bin/rotatelogs.exe ログファイル名 期間 オフセット"
例えばアクセスログで、ファイル名を logs/access.log 、期間を 86400 、オフセットを 540 、フォーマット名を common とした場合は次のように記述します。
CustomLog "|bin/rotatelogs.exe logs/access.log 86400 540" common
これでログが保存される時に指定した時間を経過するたびに別のログファイルを作成して記録するようになります。
指定した期間毎にファイルを分ける
指定した期間を経過したら新しいログファイルにログを記録する方法を試してみます。今回は確認をするためにとても短い期間の 5 分毎にログを保存するファイルを変更します。
CustomLog "|bin/rotatelogs.exe logs/access.log 300 540" common
httpd.conf に記述してください。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#
# CustomLog "logs/access.log" common
CustomLog "|bin/rotatelogs.exe logs/access.log 300 540" common
</IfModule>
設定が終わりましたら httpd.conf を保存したあと Apache を再起動します。
Apache で公開しているサイトへブラウザからアクセスしてください。そのあとでログファイルを確認してみると、新しいログファイル access.log.1717855200 が作成されていることが確認できます。( .1717855200 の部分はログファイルが作成されたときに日時によって決まります)。
現在ログファイルが分けられる期間は 300 秒(= 5分)に設定されているので、 5 分間はサイトへのアクセスログは同じファイルに記録されていきます。では 5 分経過したあとに再度サイトへブラウザからアクセスしてください。そのあとでログファイルを確認してみると、先ほどとは別の新しいログファイル access.log.1717855500 が作成されてログが記録されていることが確認できます。
このように指定した期間毎に新しいログファイルが作成されてログが記録されていきます。
指定したファイルサイズを超えたらファイルを分ける
ログファイルが指定したサイズを超えたら新しいログファイルに記録するかどうかを実際に試してみます。今回はファイルサイズが 1KByte 毎にログを保存するファイルを変更します。
CustomLog "|bin/rotatelogs.exe logs/access.log 1K 540" common
httpd.conf に記述してください。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#
# CustomLog "logs/access.log" common
CustomLog "|bin/rotatelogs.exe logs/access.log 1K 540" common
</IfModule>
設定が終わりましたら httpd.conf を保存したあと Apache を再起動します。
そのあとで Apache で公開しているサイトへブラウザから一度アクセスしてください。そのあとでログファイルを確認してみると、新しいログファイル access.log.1717855896 が作成されていることが確認できます。
現在の設定ではログファイルが 1KByte を超えるたびにファイルが分かれるようになっています。何度かサイトを訪問してアクセスログのサイズが 1Kbyte を超えると、自動的に次のログファイル access.log.1717856027 が作成されてログが記録されていることが確認できます。
このようにログファイルが指定したサイズになると自動的に新しいログファイルが作成されてログが記録されていきます。
ログファイル名のサフィックスの書式を設定する
特に設定を行わない場合、ログファイルの後ろには 1970年1月1日 からの経過秒数が表示されます。このままでは分かりにくいためログを区別するために付くサフィックスのフォーマットを指定できます。フォーマットは次の項目と通常の文字を組み合わせて設定します。
%Y 年 %m 月 %d 日 %H 時 %M 分 %S 秒
例えば %Y-%m-%d と指定した場合は access.log.2024-06-08 のようなファイル名となります。実際には次のように記述します。
CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d 86400 540" common
それではサフィックスのフォーマットとして %Y-%m-%d-%H-%M-%S を指定してみます。期間は 86400 (=1日) です。
httpd.conf に記述してください。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#
# CustomLog "logs/access.log" common
CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d-%H-%M-%S 86400 540" common
</IfModule>
設定が終わりましたら httpd.conf を保存したあと Apache を再起動します。
そのあとで Apache で公開しているサイトへブラウザから一度アクセスしてください。そのあとでログファイルを確認してみると、指定した形式で新しいログファイルが作成されていることが確認できます。
ログファイルに付けられているサフィックスが指定したフォーマットとなっているのが確認できます。ただ年月日は実際の値が反映されていますが、時分秒はすべて 0 となっています。これはファイルを分ける期間が 1 日単位になっているためで、時分秒の情報がなくてもサフィックスが同じになることがないためです。
ファイルを分ける期間を 300 (=5分) に設定してみます。
CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d 300 540" common
改めてログファイルがどのように作成されるのか確認してみると、今度は時と分の情報がサフィックスに反映されています。
指定した数のファイルでローテーションを行う
これまでの設定では指定した期間が経過する、または指定したサイズを超えるたびに新しいログファイルを無制限に作成するものでした。 rotatelogs ツールを実行するときに -n オプションを付けることで、指定した数のログファイルを作成したら、次は一番古いログファイルを削除してから同じファイル名で改めてログファイルを作成するようにできます。
rotatelogs.exe -n 最大数 ログファイル名 期間 UTCとのオフセット rotatelogs.exe -n 最大数 ログファイル名 サイズ UTCとのオフセット
例えばログファイル名が access.log でオプションとして -n 3 を指定した場合、ログファイルは次の 3 つが順番に作成されます。
access.log access.log.1 access.log.2
そして 4 つ目のログファイルが必要になったとき、最初の access.log が削除されたあと、改めて access.log が作成されてログが記録されます。同じように 5 つ目のログファイルが必要になると access.log.1 が削除されたあとで改めて access.log.1 が作成されてログが記録されます。このように決められた数のログファイルを使ってログのローテーションが行われます。
それでは実際に試してみます。 httpd.conf に次のように記述してください。
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#
# CustomLog "logs/access.log" common
CustomLog "|bin/rotatelogs.exe -n 3 logs/access.log 100 540" common
</IfModule>
設定が終わりましたら httpd.conf を保存したあと Apache を再起動します。
そのあとで Apache で公開しているサイトへブラウザから一度アクセスしてください。 access.log ファイルにログが記録されます。
指定した期間が経過したあとにサイトへアクセスすると次に access.log.1 ファイルが作成されてログが記録されます。同じように指定した期間が経過すると次に access.log.2 ファイルが作成されてログが記録されます。
そしてさらに指定した期間が経過したあとにサイトへアクセスすると、一番最初に作成された access.log が削除されたあとで改めて access.log ファイルが作成されてログが記録されます。元々あったファイルへ追加で記録されるわけではない点に注意してください。
このように指定した数のファイルが順番に作成されてログが記録されていきます。古いログは順次削除されていくのでログファイルだけで容量をいっぱいに使用してしまうということはなくなりますが、古いログは消えていくのでどの程度古いログを残しておくのかを検討したうえで、ファイルが新しいものに変わる期間や容量と、ローテーションするファイルの数を決めてください。
-- --
ログを指定期間毎に別のファイルに分ける rotetalogs ツールの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。