Rails + Unicorn の logrotate

調べたこと

Railsで作成したアプリケーションをUnicornから起動させたときの、ログローテーションのやり方を調べてみた。


仕掛け

Unicornには、USR1シグナルを送ると、ログファイルを開きなおしてくれる機能が備わっている。そのため、現在のログをリネームした後、USR1シグナルを送信すれば、ログをローテートできるようだ。


Unicornのlogrotate設定

上記を踏まえ、logrotateの設定ファイルはこんな感じにしてみた。

/home/sample/rails_app/log/*.log {
  daily
  missingok
  rotate 60
  dateext

  # 圧縮設定 (圧縮は次回のローテートまで遅らせる)
  compress
  delaycompress

  # unicorn masterプロセスに、USR1シグナルを送る
  lastaction
    pid=/home/sample/rails_app/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}

これを /etc/logrotate.d/rails_app に配置して設定は完了。


補足:ログローテーションの動作確認方法

logrotateの設定ファイルをテストするには、-d オプションをつける。

# logrotate -d /etc/logrotate.d/rails_app

このコマンドでは、実際にローテーションは行われずに、設定に問題がないかを確認できる。


また、-dオプションを付けずに、ログローテーションを実行すると、/var/lib/logrotate.status に、日付が記録される。
この日付を編集して、ローテートの動作を確認することができる。