CentOS - Rails ログローテーション!

Updated:


今日は、CentOS 6.2 上に構築した Ruby on Rails 環境のログの肥大化対策についてです。

Ruby on Rails で Web 公開(production モードでの運用)すると Web サーバのログとは別にログが記録されます。 開発(development)モードほどではありませんが、公開(production)モードもログは日々肥大化していきます。

Rails のロガー機能を使用する方法もあるようですが、今回は CentOS 上で様々なログのローテーションを行っている logrotate を使用してみます。

以下がその記録です。

作業記録

1.logrotate 全体設定の確認

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

# cat /etc/logrotate.conf
# 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.個別の設定ファイル作成

前述の “/etc/logrotate.conf” に記述してもいいのですが、”/etc/logrotate.d” 内の設定ファイルを取り込むようになっているので、他のログと同様 “/etc/logrotate.d” 配下に設定ファイルを作成します。 ※Rails アプリの名称は “hoge”、配置先は “/var/www/rails/” を想定。

File: /etc/logrotate.d/rails_hoge

1
2
3
4
5
6
7
8
/var/www/rails/hoge/log/production.log {
  weekly
  rotate 4
  missingok
  notifempty
  copytruncate
  create 0666 fuga fuga
}

【2013.07.19 追記 –> 】
Ruby on Rails を unicorn で動かしている場合は、以下のようにする。(unicorn プロセス部分を追加)

File: /etc/logrotate.d/rails_hoge

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

  # unicorn masterプロセスに、USR1シグナルを送る
  lastaction
    pid=/var/www/rails/mk-mode/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/rails_hoge
( or # logrotate -df /etc/logrotate.conf )
reading config file /etc/logrotate.d/rails_hoge
reading config info for /var/www/rails/hoge/log/production.log 

Handling 1 logs

rotating pattern: /var/www/rails/hoge/log/production.log  forced from command line (1 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/rails/hoge/log/production.log
  log needs rotating
rotating log /var/www/rails/hoge/log/production.log, log->rotateCount is 1
dateext suffix '-20120108'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /var/www/rails/hoge/log/production.log to /var/www/rails/hoge/log/production.log-20120123
truncating /var/www/rails/hoge/log/production.log

※オプション “d” はデバッグモード(詳細を出力)、”f” はログローテーションの強制実行。 ※全てのログローテートを試行するなら以下のようにする。

# logrotate -df /etc/logrotate.conf

【2013.07.19 追記 –>】

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

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

【<– 追記ここまで】


以上。





 

Sponsored Link

 

Comments