rotetalogs:ログを指定した期間やサイズで別のファイルに分けて記録する

ログは同じファイルに記録を続けていきますが日数が経過するとファイルサイズも大きくなり必要な情報を探すのも面倒になります。 Apache で用意されている rotetalogs ツールを使用すると、指定した期間毎にログのファイルを分けてログを記録していくことができます。またログファイルの最大数を指定して、ログをローテーションさせることもできます。ここではログを指定期間毎に別のファイルに分ける rotetalogs ツールの使い方について解説します。

(Last modified: )

rotetalogsツールの使い方

ログを一つのファイルではなく、設定した条件を満たすたびにファイルを分けて記録するためのツールとして rotetalogs ツールが用意されています。 Apache をインストールしたディレクトリの中の bin ディレクトリの中に含まれています。

rotetalogsツールの使い方(1)

使い方は次の通りです。

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.1611532800 が作成されていることが確認できます。

指定した期間毎にファイルを分ける(1)

現在ログファイルが分けられる期間は 300 秒(= 5分)に設定されているので、 5 分間はサイトへのアクセスログは同じファイルに記録されていきます。では 5 分経過したあとに再度サイトへブラウザからアクセスしてください。そのあとでログファイルを確認してみると、新しいログファイル access.log.1611619200 が作成されていることが確認できます。

指定した期間毎にファイルを分ける(2)

指定したファイルサイズを超えたらファイルを分ける

ログファイルが指定したサイズを超えたら新しいログファイルに記録するかどうかを実際に試してみます。今回はファイルサイズが 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.1611532800 が作成されていることが確認できます。

指定したファイルサイズを超えたらファイルを分ける(1)

現在の設定ではログファイルが 1KByte を超えるたびにファイルが分かれるようになっています。何度かサイトを訪問してアクセスログのサイズが 1Kbyte を超えると、自動的に次のファイルが作成されてログの記録が継続されます。

指定したファイルサイズを超えたらファイルを分ける(2)

ログファイル名のサフィックスの書式を設定する

特に設定を行わない場合、ログファイルの後ろには 1970年1月1日 からの経過秒数が表示されます。このままでは分かりにくいためログを区別するために付くサフィックスのフォーマットを指定できます。フォーマットは次の項目と通常の文字を組み合わせて設定します。

%Y 年
%m 月
%d 日
%H 時
%M 分
%S 秒

例えば %Y-%m-%d と指定した場合は access.log.2021-01-25 のようなファイル名となります。実際には次のように記述します。

CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d 86400 540" common

それではサフィックスのフォーマットとして %Y-%m-%d-%H-%M-%S を指定してみます。期間は 86400 (=1日) です。

CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d-%H-%M-%S 86400 540" common

httpd.conf に記述して保存したあと、 Apache を再起動します。ブラウザからサイトへアクセスしてください。そのあとで作成されたログファイルを確認してみます。

ログファイル名のサフィックスの書式を設定する(1)

ログファイルに付けられているサフィックスが指定したフォーマットとなっているのが確認できます。ただ年月日は実際の値が反映されていますが、時分秒はすべて 0 となっています。これはファイルを分ける期間が 1 日単位になっているためで、時分秒の情報がなくてもサフィックスが同じになることがないためです。

ファイルを分ける期間をを 300 (=5分) に設定して改めてログファイルがどのように作成されるのか確認してみると、今度は時と分の情報がサフィックスに反映されています。

ログファイル名のサフィックスの書式を設定する(2)

指定した数のファイルでローテーションを行う

これまでの設定では指定した期間が経過する、または指定したサイズを超えるたびに新しいログファイルを無制限に作成するものでした。 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>

そのあとでサイトへアクセスすると最初に access.log ファイルが作成されてログが記録されます。

指定した数のファイルでローテーションを行う(1)

指定した期間が経過したあとにサイトへアクセスすると次に access.log.1 ファイルが作成されてログが記録されます。同じように指定した期間が経過すると次に access.log.2 ファイルが作成されてログが記録されます。

指定した数のファイルでローテーションを行う(2)

指定した数のファイルでローテーションを行う(3)

そしてさらに指定した期間が経過したあとにサイトへアクセスすると、一番最初に作成された access.log が削除されたあとで改めて access.log ファイルが作成されてログが記録されます。元々あったファイルへ追加で記録されるわけではない点に注意してください。

指定した数のファイルでローテーションを行う(4)

このように指定した数のファイルが順番に作成されてログが記録されていきます。古いログは順次削除されていくのでログファイルだけで容量をいっぱいに使用してしまうということはなくなりますが、古いログは消えていくのでどの程度古いログを残しておくのかを検討したうえで、ファイルが新しいものに変わる期間や容量と、ローテーションするファイルの数を決めてください。

-- --

ログを指定期間毎に別のファイルに分ける rotetalogs ツールの使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。