Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@tomluck

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

実行結果

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

rotatelogs.png

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

おわりに

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

17
Help us understand the problem. What is going on with this article?
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
17
Help us understand the problem. What is going on with this article?