logrotate に関するメモ(2002/03/05) 
 

logrotateとは

各種アプリケーションから出力されるログを、一定期間毎に分割・待避・圧縮する機能を持つ。

Cobalt FAQ

Apache の log を logrotateで

ログの肥大化防止策 logrotate の活用について

設定方法

Cobalt の logrotate の設定ファイルは /etc/logrotate.conf が基本で各アプリケーション毎の設定が
/etc/logrotate.d 以下に記述されています。 
ちなみに logrotate が実行されるタイミングは
(1) /etc/crontab に記述されている設定通りの時間に /etc/cron.daily 以下のスクリプトが実行される。
(2) /etc/cron.daily/logrotate により logrotate が実行される。
となっています。 

ローテーションはされますが、昔のログもすぐには消さず、一時保存されます。 
/etc/logrotate.d/apache の中をみると 

/var/log/httpd/access {
   prerotate
      /usr/local/sbin/split_logs web < /var/log/httpd/access
   endscript
   missingok
   postrotate
      /usr/bin/killall -HUP httpd 2> /dev/null || true
   endscript
   daily
}

となっています、実は Apache から出力されるログは /var/log/httpd/home-access ファイルなのです。ですので、この記述はされていてもローテイトはされません。、毎日12:00にファイルが綺麗にされているのです。不思議・・・・

とりあえず、apache のログを CustomLog /var/log/httpd/access.log combined と変更して、そのログに合わせて /etc/logrotate.d/apache の記述を変更してみることとします。

/var/log/httpd/access.log {
   rotate 5
   missingok
   compress
   size 40M
 }

'rotate 5' と記述されていますので、5回分ログは(compressされて)保持されます。
上記の場合の処理は、logrotate実行時に /var/log/httpd/access の容量が 40M を越えた場合、 
(1) /var/log/httpd/access.log.5.gz があれば削除する。access.log.4.gzがあれば access.log.5.gzに移動、・・・ access.log.1.gzまで繰り返す。
(2) httpd プロセスが /var/log/httpd/access.log を /var/log/httpd/access.log.1 とし新たに/var/log/httpd/access.log を生成してそちらにログを出力する。
(4) /var/log/httpd/access.log.1 を gzip で圧縮する。
という処理が行われます。 

ログをもう少し保存したい場合は、例えば以下のようにします。毎月ログを圧縮して、3月分までログファイルを保持する、というケースです。 

/var/log/httpd/access.log {
  monthly
  compress
  rotate 3
  postrotate
  killall -USR1 httpd
  endscript
}