Rails1.2.5 Railsの運用環境で気をつけること-ログファイルとセッションファイルの整理

Ruby on Railsをデフォルト環境のまま使うと、ログやセッションのファイルが無制限に増えていくので、どこかでそれらを整理する必要があります。正直なところ、この2点が自動化されないのはRails運用上の大きな弱点ではないかと思っています*1
(追記 Nov 23, 2007)
Rails2.0からはCookieStoreという新しいSession管理が導入されたため、デフォルト設定でセッションファイルのメンテナンスは不要になります。詳細はこちら

セッションファイルの整理

デフォルトではrails-app/tmp/sessionsにユーザセッションがファイル形式で保存されます。このセッションファイル、特にアクセスが多いサイトでは膨大な数になったりするのですが、Railsが勝手に消してくれたりはしないので、定期バッチなどで自前で削除していく必要があります。以下はUnix系の環境でアクセスが10日以上ないファイルを削除するためのコマンドです。


find /rails-app/tmp/ -name 'ruby_sess*' -ctime +10 -delete

ログファイルのローテート

railsのデフォルト設定ではログファイルをロールオーバーしてくれないので、放っておくとログファイルがどんどん肥大化していきます。Linux環境などではlogrotateを使うのが良いでしょう。logrotateについては解説しているサイトがたくさんあるので、うちの環境(Ubuntu)での設定だけを簡単に。/etc/logrotate.dの下に以下の内容のファイルを作成します。


/rails-app/log/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
sharedscripts
postrotate
for i in `ls /rails-app/log/*.pid`; do
kill -USR2 `cat $i`
done
endscript
}
これでcronが自動実行されます。実行時間については/etc/crontabで設定できます。
Unix系はこれでいいとして、Windowsの場合にはどうすればよいでしょう。アプリがシングルプロセスで動いている場合は、config/environment.rbに以下のような記述をしてやると、日別にログファイルが作成されるようになります。

config.logger = Logger.new(config.log_path, 'daily')
ただしこれは、mongrel_clusterを使うなどで複数プロセス構成にしているとファイルの切り替えがうまくいかない場合があります。このようなケースでは、一度全てのプロセスをとめてからファイルをローテートする処理を別途自前で行うしかないのかもしれません。

*1:実装的に難しいのは理解できるのですが、これを知らないと運用的にまずいというのは厳しいかと・・・まぁ、文句があるならお前が作れという話しなのですが。ア、ワタシジシンハコマッテナイノデ・・・