Sinatraアプリのログをローテーションする

去年の7月から Sinatra + Unicorn で動かしている Web アプリがあるんだけど、そのログファイルが巨大になっていた。↓の unicorn.log がそれ。75MBにもなっている。
そこで、logrotate を使ってみることにした。

takatoh@nightschool $ ls -lh
合計 75M
-rw-rw-r-- 1 sombrero sombrero  752  7月 26  2014 CHANGES
-rw-rw-r-- 1 sombrero sombrero  122  7月 26  2014 Gemfile
-rw-rw-r-- 1 sombrero sombrero  468  7月 26  2014 Gemfile.lock
-rw-rw-r-- 1 sombrero sombrero 7.5K  1月  4 10:39 app.rb
-rw-rw-r-- 1 sombrero sombrero   64  7月 26  2014 app.ru
drwxrwxr-x 2 sombrero sombrero 4.0K  7月 26  2014 bin
-rw-rw-r-- 1 sombrero sombrero  327  7月 26  2014 boot.rb
-rw-rw-r-- 1 sombrero sombrero  126  7月 26  2014 config.yaml
-rw-rw-r-- 1 sombrero sombrero  104  7月 26  2014 config.yaml.sample
drwxrwxr-x 3 sombrero sombrero 4.0K  4月  8 04:59 db
drwxrwxr-x 3 sombrero sombrero 4.0K  7月 26  2014 lib
drwxrwxr-x 3 sombrero sombrero 4.0K  7月 26  2014 public
-rw-rw-r-- 1 sombrero sombrero  705  7月 26  2014 rakefile
-rw-rw-r-- 1 sombrero sombrero   14  7月 26  2014 start.cmd
drwxrwxr-x 2 sombrero sombrero 4.0K  4月  8 05:00 tmp
-rw-rw-rw- 1 sombrero sombrero  109  7月 26  2014 unicorn.conf
-rw-rw-r-- 1 sombrero sombrero  75M  4月  8 16:50 unicorn.log
-rw-r--r-- 1 root     root        5  3月 24 20:43 unicorn.pid
-rw-rw-r-- 1 sombrero sombrero   32  7月 26  2014 version.rb
drwxrwxr-x 2 sombrero sombrero 4.0K  7月 26  2014 views

参考になったのは次のページ。

 cf. Rails + Unicorn の logrotateAdd Star – yoshioblog
 cf. ログローテーション(logrotate)を使ってみる ( httpd(apache)の設定例 )

特に上のページを参考にして設定ファイルを書いてみた。設定ファイルは /etc/logrotate.d ディレクトリの下に、サービス名でファイルを作ればいいようだ。
書いた設定がこれ。

/home/sombrero/sombrero/unicorn.log {
    daily
    missingok
    rotate 60
    dateext
    compress
    delaycompress

    postrotate
    pid=/home/sombrero/sombrero/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
    endscript
}

設定の意味は次の通り。

  • daily 毎日ローテーションする
  • missingok ログファイルがなくてもエラーを出さない
  • rotate 60 60回ローテーションする
  • dateext ローテーションされたログファイルのサフィックスを日付形式にする
  • compress ローテーションされたログファイルを圧縮する
  • delaycompress 圧縮するのを次のローテーションの時にする

postrorate と endscript の間の記述は、ローテーションが終わったあとに実行される。
Unicorn は USR1 シグナルを受け取ると、ログファイルを開きなおしてくれるそうなので、そうしている。

logrotate -d で確認する。

takatoh@nightschool $ logrotate -d sombrero
reading config file sombrero

Handling 1 logs

rotating pattern: /home/sombrero/sombrero/unicorn.log  after 1 days (60 rotations)
empty log files are rotated, old logs are removed
considering log /home/sombrero/sombrero/unicorn.log
  log does not need rotating

エラーらしきものは出てないから大丈夫のようだ。
あとは1日待って確認しよう。