Help us understand the problem. What is going on with this article?

Apacheのログをrotatelogsのみで世代管理をする方法

More than 1 year has passed since last update.

はじめに

 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

実行結果

ファイルサイズ指定の場合のみですが、実行結果です。

rotatelogs.png

エラーログ(error_log)が1KBを超えたため、2世代目(error_log.1)に切り替わったことが分かると思います。
1世代目のファイルが1KB(1024B)ピッタリではなく、少しオーバーしているのは、最後に記録したログの内容によって前後するものと考えています。他の理由などご存知の方がいらっしゃいましたら教えてください。

おわりに

logrotate.dなどLinuxでApacheのログを管理する方法は他にもありますが、Apacheをインストールすると標準で使えるrotatelogsを使った管理に興味がある方は参考にしていただけると幸いです。

tomluck
環境の構築や初めてツールを使ってみて他の人にも使えそうな情報の記事を書いています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした