2016年4月22日金曜日

logrotateを1時間ごとに実行する

logrotateの最新版をインストールして、logrotateを1時間ごとに実行させます。
たとえば、アクセスが多いサーバだとnginxのアクセスログなどが膨らんで、1日1回のローテートと圧縮では、ディスク容量が足りなくなったりすることが、よくあると思います。また、ログの行数が多いと、生ログを調査するときにgrepするのが辛くなってきたりします。そこで、1時間毎にログをローテートして小分けにする方法として、logrotateの最新版でサポートされている hourly オプションを使ってローテートしてみました。

以下、セットアップ方法です。
環境は、CentOS 6.7です。

現在のlogrotateバージョンを確認。
$ logrotate
logrotate 3.7.8 - Copyright (C) 1995-2001 Red Hat, Inc.
現在の各種ライブラリをインストール。rpmbuildで最新版logrotateのrpmファイルを作ります。
$ sudo yum groupinstall "Development Tools" 
$ sudo yum install popt-devel rpmdevtools
$ rpmdev-setuptree
$ wget https://fedorahosted.org/releases/l/o/logrotate/logrotate-3.9.1.tar.gz
$ cp logrotate-3.9.1.tar.gz rpmbuild/SOURCES/
$ tar -zxvf logrotate-3.9.1.tar.gz
$ cp logrotate-3.9.1/logrotate.spec rpmbuild/SPECS
$ rpmbuild -bb rpmbuild/SPECS/logrotate.spec
logrotate最新版をインストール。
$ cd rpmbuild/RPMS/x86_64/
$ sudo rpm -Uvh logrotate-3.9.1-1.x86_64.rpm
# logrotate --version
logrotate 3.9.1
nginxの設定ファイルを編集。
# emacs /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        hourly
        missingok
        rotate 240
        compress
        delaycompress
        create 644 nginx adm
        dateext
        dateformat -%Y%m%d%H
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}
logrotateのcronの設定を、dailyからhourlyに移動。
# mv /etc/cron.daily/logrotate /etc/cron.hourly/
しばらく待って、ログを見てみましょう。
# ls -al /var/log/nginx | grep access.log
-rw-r--r--   1 nginx adm    302091 Apr 22 14:12 access.log
-rw-r--r--   1 nginx adm    114085 Apr 22 12:01 access.log-2016042212.gz
-rw-r--r--   1 nginx adm    149606 Apr 22 13:01 access.log-2016042213.gz
-rw-r--r--   1 nginx adm   1240079 Apr 22 14:01 access.log-2016042214
ちゃんとローテートされていますね。

Top pic from Ralph Arvesen Star trails while watching Perseid meteor shower