Apacheのログのローテーションをrotatelogsのみで世代管理をする
Apache v2.4.5未満ではrotatelogsはローテーションはしてくれるものの、削除はしてくれませんでした。そのため、世代管理するためには、独自に削除用のスクリプトを作成し、cronなどで定時実行する必要がありました。
Apache v2.4.5以降はオプション(-n)が使えるようになり、rotatelogs単体で世代管理ができるようになったため、その方法をまとめました。
実行環境
- OS:CentOS 7.3
- Apache : v2.4.23
rotatelogsのオプション
rotatelogsのオプションは次の通りです。
SYNOPSIS rotatelogs [ -l ] [ -L linkname ] [ -p program ] [ -f ] [ -t ] [ -v ] [ -e ] [ -c ] [ -n number-of-files ] logfile rotationtime|filesize(B|K|M|G) [ offset ]
世代管理に必要なオプション
この中で、世代管理をするのに必要なオプションは次の通りです。
- -nオプション:世代を指定する ※v2.4.5以上から使用可能
- logfile:ログファイル名を指定する
- rotationtime | filesize:ローテーションする時間 or ファイルサイズのどちらかを指定する
- filesizeは単位の指定が可能です。(B:バイト、K:キロバイト、M:メガバイト、G:ギガバイト)
上記以外の便利なオプション
rotatelogsの設定内容を取得するために(-v)オプションを使うと、次のように設定情報を取得できます。
Rotation time interval: 0 Rotation size interval: 500 Rotation time UTC offset: 0 Rotation based on localtime: no Rotation file date pattern: no Rotation file forced open: no Rotation verbose: yes Rotation create empty logs: no Rotation file name: /home/username/httpd/var/logs/error_log Post-rotation prog: (null) File rotation needed, reason: Open a new file Opening file /home/username/httpd/var/logs/error_log
他のオプションは使ったことがないので分かりません。
rotatelogsを使ったログ設定のconfファイル内容
httpd.confのうち、変更点のみ記述します。
両方ともオリジナルではファイル名のみ記述していたものを、パイプでつないでrotatelogsとオプションを指定しています。
ファイルサイズ指定の場合
1ファイル1KB単位で4世代まで記録する設定例です。
- エラーログ
-ErrorLog "logs/error_log" +#ErrorLog "logs/error_log" +ErrorLog "|/usr/sbin/rotatelogs -n 4 /home/username/logs/httpd_logs/error_log 1K"
- アクセスログ
- CustomLog "logs/access_log" combined + #CustomLog "logs/access_log" combined + CustomLog "|/usr/sbin/rotatelogs -n 4 /home/username/logs/httpd_logs/access_log 1K" combined
ローテーションする時間指定の場合
1日単位で4世代まで記録する設定例です。
ファイルサイズ指定の場合との違いは、ローカルタイム用のオプション(-l)を指定していることと、ファイルサイズの代わりにローテーション間隔(秒単位)を指定しているところです。
なお、rotatelogsはファイル名に日付のフォーマット(%Y%m%dなど)を指定できるのですが、世代管理のオプション(-n)と同時指定はできない仕様です。
同時指定すると、”Cannot use -n with % in filename”というエラーになりますのでご注意ください。
- エラーログ
-ErrorLog "logs/error_log" +#ErrorLog "logs/error_log" +ErrorLog "|/usr/sbin/rotatelogs -l -n 4 /home/username/logs/httpd_logs/error_log 86400"
- アクセスログ
- CustomLog "logs/access_log" combined + #CustomLog "logs/access_log" combined + CustomLog "|/usr/sbin/rotatelogs -l -n 4 /home/username/logs/httpd_logs/access_log 86400" combined
実行結果
ファイルサイズ指定の場合のみですが、実行結果です。
エラーログ(error_log)が1KBを超えたため、2世代目(error_log.1)に切り替わったことが分かると思います。
1世代目のファイルが1KB(1024B)ピッタリではなく、少しオーバーしているのは、最後に記録したログの内容によって前後するものと考えています。他の理由などご存知の方がいらっしゃいましたら教えてください。
おわりに
logrotate.dなどLinuxでApacheのログを管理する方法は他にもありますが、Apacheをインストールすると標準で使えるrotatelogsを使った管理に興味がある方は参考にしていただけると幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません