Apache 2.0.48 のログを 1 日単位で分割する

SERVER


Apache のログファイル

Apache は Linux などで人気の高い Web サーバです。これを運用して HTTP リクエストなどの情報をログに記録するときに、初期設定のままや一般的な方法でログ収集をしていると、Apache を起動させ続けている限りは 1 つのファイルにログが収集されて行きます。

ある程度の規模なサイトならそれでも問題ないのかもしれないですけど、 それでもログをチェックするのが難しくなってしまいますし、頻繁にアクセスがあるようなサイトの場合はなおさら、不要なログデータの削除などにも一苦労となってしまいます。

そこで、定期的にログを分割する方法はないかなと調べてみたところ、Apache 2 に標準で "rotatelogs" というプログラムが備わっていることを知りました。今回は、それを用いてログの分割を行ってみようと思います。

 

ログを一日単位で分割する

"rotatelogs" プログラムは、引数にログファイル名および、分割サイクルやサイズなどを指定して利用します。

まず最初の引数で保存したいログファイル名を指定したら、次の引数でログを分割するサイクルを秒単位で指定します。その時、サイクルは Apache が起動した時刻を開始とするのではなくて、UTC 時間を基準にして判断されるとのことですけど、さらに分単位の数値を続けて指定することで、ローカルタイムとのずれを補正することが出来るとのことでした。

また、数値だけではなく最後に "M" を付加することで、時刻ではなくファイルサイズによってログを分割することが出来るとのことでした。その時の指定サイズは MB 単位です。

また、ログ収集のファイル名も細かく指定することが出来るようになっています。プログラミングで言うところの "strftime" 関数で指定できる諸そ気文字列を利用できるとのことで、例えば 20060615 といった日付をファイル名に含めたい場合には "%Y%m%d" というように指定します。

 

後はこれを "TransferLog", "ErrorLog", "ScriptLog" などに、パイプ ( | ) を挟んで指定してあげます。

CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache/access.%Y%m%d.log 86400 540" combined

たとえばこのようにすることで、1 日 ( 86400 秒 ) ごとに "access.20060615.log" といった日付入りのファイルへ分割して、カスタムログを収集することが出来ます。日本時間は UTC + 9:00 なので、さらに 540 分の時間差も補整しています。

なお、ログファイルが生成されるタイミングは、サイトが要求されてログを記録する必要があった時のようでした。