Linux上で稼働しているRuby on RailsアプリケーションのログローテーションにRubyの Logger クラスの機能を使うか、Linuxの logrotate を使うか検討してみました。
Railsではログローテーションは行わず、 logrotate で行う
理由:
Ruby on RailsではデフォルトでRubyの Logger クラスがログ出力に利用されており、その Logger クラスにはログローテーション機能が含まれています。
https://docs.ruby-lang.org/ja/2.2.0/class/Logger.html
例えば以下のように設定することで、ファイルサイズが10MBを超えたらログをローテーションし、古いログファイルを最大30件保持するような動作が実現できます。
config.logger = Logger.new('log/application.log', 30, 10 * 1024 * 1024)
/etc/logrotate.d/myapp に以下のような設定を記述する
/var/www/log/*.log {
size 5M
rotate 5
create 0644 rails rails
copytruncate
missingok
notifempty
nocompress
}
/var/www/log に出力されるので、対象は /var/www/log/*.log にするrails 、グループ rails で稼働させているので、ローテーション後に作成するログも同様にする664 なので、ローテーション後に作成するログも同様にするcopytruncate をオンにする最近はAWSのマネージドサービスを組み合わせてシステムを構築することも多くなってきたので、こういったLinuxの設定周りはあまりやらなくなってきましたが、こういった運用周りの設定は嫌いじゃないです。