こんにちは。Takitaです。
./log/production.log はRailsがログローテーションしてくれますが、Unicornは自分で設定する必要があります。Unicornのログローテーションを設定する方法について書きました。
/etc/logrotate.d/
以下に設定ファイルを作成します。
/etc/logrotate.d/unicorn
/var/www/app_name/shared/log/unicorn.*.log {
daily # ログローテーションを毎日に行う
missingok # ログファイルが存在しなくてもエラーを出さずに処理を続行
rotate 3 # 3世代ログを残す
notifempty # ログファイルが空ならローテーションしない
create 0640 hanako hanako # パーミッション user group
# unicorn masterプロセスに、USR1シグナルを送る
lastaction
pid=/var/www/app_name/shared/tmp/pids/unicorn.pid
test -s $pid && kill -USR1 "$(cat $pid)"
endscript
}
lastaction ~ endscript
は mk-mode BLOGで紹介されていた方法を利用させていただきました。
$ logrotate -d /etc/logrotate.conf
$ cat /var/lib/logrotate/status | grep unicorn # ubuntuの場合は /status
$ cat /var/lib/logrotate.status | grep unicorn # centosの場合は .status
"/var/www/app_name/shared/unicorn.*.log" 2017-8-16-15:0:0
/var/www/app_name/shared/unicorn.*.log" 2017-8-16-15:0:0
で設定が反映されています。
/var/lib/logrotate.statusファイルにunicornが存在しない場合は、 logrotate -d /etc/logrotate.conf
で処理がskipされている可能性があります。(僕はされてました)
considering log /var/www/app_name/shared/unicorn.*.log
log /var/www/app_name/shared/unicorn.*.log does not exist -- skipping
普通にログファイルがない、というエラーです。
上記の場合はpathが間違っており、/var/www/app_name/shared/log/unicorn.*.log
にするとOKです。
error: skipping "/var/www/app_name/shared/unicorn.*.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
ログにあるように権限を変更するか /etc/logrotate.d/unicorn
に su user group
を追加すればOKです。
/var/www/app_name/shared/log/unicorn.*.log {
daily
missingok
rotate 3
notifempty
copytruncate
create 0640 hanako hanako
su hanako hanako
copytruncate
オプションを使用すれば、 USR1
をunicornに送らなくても良いのでは?と思った。(試してはない)
https://www.mk-mode.com/octopress/2014/02/02/unicorn-logrotation/