当サイトは、アフィリエイト・アドセンス広告を掲載しています。広告があるサイトであると知っていただければ幸いです。

消費者庁が、2023年10月1日から施行予定である景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Apacheのログのローテーションをrotatelogsのみで世代管理をする

Apacheログローテーション

 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

実行結果

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

847e2603 c018 3dfd c989 ec8fc44075c3 - Apacheのログのローテーションをrotatelogsのみで世代管理をする

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

おわりに

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

技術apache

Posted by tomluck