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” の該当の行の日付をローテーションサイクルより古い日付に変更してログローテートを実行してみるとよい。
【<– 追記ここまで】
以上。
Comments