logrotateでログをローテーションする

linux

logrusがローテーションする仕組みを持っていなかったので、 READMEに書いてあったlogrotateを使う。/etc/logrotate.dの中に設定ファイルを入れて、cronで回して使う。

FROM ubuntu:14.04

ADD logrotate /etc/logrotate.d/app
RUN echo "/usr/sbin/logrotate /etc/logrotate.conf" > /etc/cron.daily/logrotate

設定ファイル(logrotate)はこんな感じ。

/var/log/*.log {
  daily
  rotate 4
  missingok
  delaycompress
  dateext
  sharedscripts
  postrotate
      echo "hi"
  endscript
}

dailyで1日に1回、rotate 4で過去4日分残し、 missingokでファイルがなくてもエラーにせず、delaycompressで圧縮するのをローテーションした次の回にして、 dateextでローテーションしたファイルの末尾を数字ではなく日付にする。 postrotateはローテーション後に実行されるスクリプトで、sharedscriptsによって各ログごとではなくまとめて一回実行される。

実際に動かして確かめる。

logrotateを実行すると、/var/lib/logrotate/statusに過去に見た時間が入る。

$ echo "aaaaa" > /var/log/app.log
$ logrotate /etc/logrotate.conf
$ cat /var/lib/logrotate/status
logrotate state -- version 2
...
"/var/log/app.log" 2016-11-9-11:0:0
...

強制的にローテーションさせてみる。

$ echo "aaaa" > /var/log/app.log
$ logrotate -f /etc/logrotate.conf
$ ls /var/log | grep app
app.log
app.log-20161109

$ cat /var/log/app.log-20161109
aaaaa