Browse Day: June 18, 2009

mod_log_rotate Tips

先日、紹介した mod_log_rotate ですが、とあるサーバで次のような設定をしたところちゃんとアクセスログがまったく ローテートしなくなってしまいました。

CustomLog “logs/access_log.%Y%m%d%H%M” combined

LoadModule log_rotate_module modules/mod_log_rotate.so
RotateLogs On
RotateLogsLocalTime On
RotateInterval 60

この設定だと、/var/logs/ に1分間ごとにアクセスログが「access_log.年月日時日分」というファイル名で順番に出力されるはずなのですが、なぜか httpd を起動した時間のアクセスログに追記され続けていてアクセスログがローテートされません。

原因を調べてみると、/var/log/httpd のパーミッションに原因がありました。/var/log/httpd のパーミッションを見てみました。

$  sudo ls -l /var/log/

drwx—— 2 root   root     4096 Jun 18 16:47 httpd

他のディレクトリは省略していますが、httpd は root のみ書き込み権限があります。mod_log_rotate が出力するときの実行ユーザは Apache の子プロセスになるので apache ユーザになるので apache ユーザで書き込み権限があるディレクトリを指定する必要があります。

解決方法としては、次の二つ考えられます。

  1. Apache ユーザで書き込める別のディレクトリを設定する
  2. /var/log/httpd ディレクトリに Apache ユーザで書き込み権限を与える

試しに /tmp で指定すると、次のようなファイルでアクセスログが生成されました。

$ ls -l /tmp

-rw-r–r– 1 root   root   3.3K Jun 18 16:47 access_log.200906181647
-rw-r–r– 1 apache apache 3.4K Jun 18 16:48 access_log.200906181648
-rw-r–r– 1 apache apache 3.4K Jun 18 16:49 access_log.200906181649
-rw-r–r– 1 apache apache 3.4K Jun 18 16:50 access_log.200906181650

起動した直後のアクセスログは root ユーザによって作成されて、mod_log_rotate によってローテートされるアクセスログは apache ユーザによって作成されているのが分かりますね。

これで、Apache module は、apache ユーザになることが理解できてよかったです。

ちなみに mod_log_rotate は、最短で1分おきにアクセスログをローテートすることができます。ローテートする間隔は、RotateInterval で秒単位で指定します。