環境
- Linux (Amazon Linux)
やりたいこと
ログファイルのsuffix(<filename>.YYYMMDD
のYYYMMDD
部分)と、ファイルに含まれるログの日時を同じにしたい。
以下、nginx, unicorn での設定例。
設定
-
postrotate
でファイル名(YYYYMMDD部分)を前日に変更するので、gzip
はその後に行う。compress
オプションは使わない。
/etc/logrotate.d/nginx
/var/www/shared/log/nginx.log {
create 0664 your_user root # 新しいファイルを作成する(無ければ作る)時のパーミッション、オーナー、グループ
daily # 日次でローテーションをする
rotate 14 # 14世代分ログを残す
missingok # ログファイルがなくてもエラーを出さない
ifempty # ログファイルが空でもローテーションする
dateext # ローテーション後のファイルに、日時(-YYYYMMDD)のsuffixを付ける
sharedscripts # 複数指定したログファイルに対して、postrotateまたはprerotateで指定したコマンドを実行する
postrotate # endscriptとの間に記述されたコマンドを、ログローテーション後に実行する
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
/bin/mv /var/www/shared/log/nginx.log-`date '+%Y%m%d'` /var/www/shared/log/nginx.log-`date '+%Y%m%d' -d '1days ago'`
/bin/gzip /var/www/shared/log/nginx.log-`date '+%Y%m%d' -d '1days ago'`
endscript
}
/etc/logrotate.d/unicorn
/var/www/shared/log/production.log /var/www/shared/log/unicorn.log {
create 0664 your_user your_user
daily
rotate 14
missingok
ifempty
dateext
sharedscripts
postrotate
/etc/init.d/unicorn restart
/bin/mv /var/www/shared/log/production.log-`date '+%Y%m%d'` /var/www/shared/log/production.log-`date '+%Y%m%d' -d '1days ago'`
/bin/gzip /var/www/shared/log/production.log-`date '+%Y%m%d' -d '1days ago'`
/bin/mv /var/www/shared/log/unicorn.log-`date '+%Y%m%d'` /var/www/shared/log/unicorn.log-`date '+%Y%m%d' -d '1days ago'`
/bin/gzip /var/www/shared/log/unicorn.log-`date '+%Y%m%d' -d '1days ago'`
endscript
}
その他
cronの設定
0 0 * * * root run-parts /etc/cron.daily
dry run
sudo logrotate -dv /etc/logrotate.d/nginx
sudo logrotate -dv /etc/logrotate.d/unicorn
実際に logrotate してみる
sudo logrotate -f /etc/logrotate.d/nginx
sudo logrotate -f /etc/logrotate.d/unicorn
以下のようなエラーが出る場合は、config (e.g. /etc/logrotate.d/nginx
) で su <owner> <group>
という形で指定するか、ディレクトリの owner/group を見直す。
sudo logrotate -f /etc/logrotate.d/nginx
error: skipping "/var/www/somewhere/log/nginx.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.