Ruby on Rails - Unicorn のログローテーション!

Updated:


以前、Ruby on Rails のログ(”production.log”)のローテーションについて記録を残しました。

Rails のログだけでなく、Rails サーバ Unicorn のログも放おっておくと肥大化します。そこで、ログローテーションの設定を行なってみました。

0. 前提条件

  • Ruby 2.0.0-p247, Rails 4.0.0 を想定(動作確認)。
  • “/var/www/rails/” ディレクトリ配下に “rails_app” という Rails アプリを作成。

1.logrotate 全体設定の確認

全体的な logrotate の設定を確認してみる。

File: /etc/logrotate.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

デフォルトでは、以下のような設定になっているはず。

設定値 説明
weekly ログローテーションを週毎に行う。
rotate 4 ログローテーションの世代数は4つ。
create ログローテーション後、代わりに空の新規ログファイルを作る。
dateext ローテーションファイルを日付形式にする。
#compress ローテーションファイルを圧縮する。
(コメントアウトで非圧縮)

2. 設定ファイル作成

Unicorn には、USR1シグナルを送るとログファイルを開き直してくれる機能が備わっている。よって、lastaction を追加している。
また、Rails アプリが複数あるようなら以下のようなブロックを並べればよい。

File: /etc/logrotate.d/unicorn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/var/www/rails/rails_app/log/unicorn.log {
  weekly
  rotate 4
  missingok
  notifempty
  copytruncate
  create 0666 fuga fuga

  # unicorn masterプロセスに、USR1シグナルを送る
  lastaction
    pid=/var/www/rails/rails_app/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
  endscript
}
設定値 説明
weekly ログローテーションを週毎に行う。
rotate 4 ログローテーションの世代数を4個に設定。
missingok 指定のログファイルが実在しなかったとしてもエラーを出さずに処理続行。
notifempty ログファイルが空ならローテーションしない。
copytruncate copy の動作を行った後、元のログファイルの内容を消去する。
create 0666 fuga fuga ローテーションを行った後、代わりに空の新規ログファイルを作る。
(postrotate も同じ)

“/etc/logrotate.d” 内の設定ファイルが “/etc/logrotate.conf” より優先されるので、同じ設定なら敢えて記述する必要もないが、当方は敢えて記述している。

3. ログローテート設定確認

ログローテートの設定に問題がないかテストしてみる。

# logrotate -df /etc/logrotate.d/unicorn
reading config file /etc/logrotate.d/unicorn
reading config info for /var/www/rails/rails_app/log/unicorn.log

Handling 1 logs

rotating pattern: /var/www/rails/rails_app/log/unicorn.log  forced from command line (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/rails/rails_app/log/unicorn.log
  log needs rotating
rotating log /var/www/rails/rails_app/log/unicorn.log, log->rotateCount is 4
dateext suffix '-20140127'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/www/rails/rails_app/log/unicorn.log.4 to /var/www/rails/rails_app/log/unicorn.log.5 (rotatecount 4, logstart 1, i 4),
renaming /var/www/rails/rails_app/log/unicorn.log.3 to /var/www/rails/rails_app/log/unicorn.log.4 (rotatecount 4, logstart 1, i 3),
renaming /var/www/rails/rails_app/log/unicorn.log.2 to /var/www/rails/rails_app/log/unicorn.log.3 (rotatecount 4, logstart 1, i 2),
renaming /var/www/rails/rails_app/log/unicorn.log.1 to /var/www/rails/rails_app/log/unicorn.log.2 (rotatecount 4, logstart 1, i 1),
renaming /var/www/rails/rails_app/log/unicorn.log.0 to /var/www/rails/rails_app/log/unicorn.log.1 (rotatecount 4, logstart 1, i 0),
copying /var/www/rails/rails_app/log/unicorn.log to /var/www/rails/rails_app/log/unicorn.log.1
truncating /var/www/rails/rails_app/log/unicorn.log
removing old log /var/www/rails/rails_app/log/unicorn.log.5
error: error opening /var/www/rails/rails_app/log/unicorn.log.5: そのようなファイルやディレクトリはありません
running last action script
running script with arg /var/www/rails/rails_app/log/unicorn.log : "
    pid=/var/www/rails/rails_app/tmp/pids/unicorn.pid
    test -s $pid && kill -USR1 "$(cat $pid)"
"

※オプション d はデバッグモード(詳細を出力)、f はログローテーションの強制実行。
※「そのようなファイルやディレクトリはありません」のエラーは、まだログファイルが存在しないために削除できないから。設定した世代分ログファイルが貯まれば解消される。

ちなみに、今回追加した Unicorn のみならず全てのログローテートの設定をテストするなら以下のようにする。

# logrotate -df /etc/logrotate.conf

4. ログローテートの強制実行について

logrotate /etc/logrotate.d/unicorn とオプションを何も指定せずに実行すると “/var/lib/logrotate.status” が作成される。
作成された “/var/lib/logrotate.status” の該当の行の日付をローテーションサイクルより古い日付に変更して、logrotate /etc/logrotate.d/unicorn を実行してみるとログローテーションの確認ができる。

ただし、このコマンドでは今回作成した設定ファイルしか読み込まないので、ファイル名が希望通りにならないかもしれない。それは、全体設定(”/etc/logrotete.conf”)を読み込まず、個別の設定ファイル(今回の場合は “/etc/logrotate.d/unicorn”)のみを読み込んでいるためである。 logrotate /etc/logrotate.d/unicorn の代わりに logrotate /etc/logrotate.conf を実行して全てのログローテートを試してみてもよい。

# ll /var/www/rails/rails_app/log/unicorn.log*
-rw-rw-rw- 1 masaru masaru      616  1月 28 00:10 2014 /var/www/rails/mk-mode/log/unicorn.log
-rw-rw-rw- 1 masaru masaru      525  1月 27 23:52 2014 /var/www/rails/mk-mode/log/unicorn.log-20140127
-rw-rw-rw- 1 masaru masaru   170630  1月 27 23:47 2014 /var/www/rails/mk-mode/log/unicorn.log.1

5. 参考サイト(当ブログ過去記事)


以上。





 

Sponsored Link

 

Comments