Logrotate: dailyとか関係なく、ログサイズでローテートしたい
tl;dr
- /etc/cron.daily/logrotateは/etc/cron.hourly/に引っ越ししよ
- maxsize使おうね
- 1日に何度もローテしたければunixtimeとか使って、ログローテしよ
# cat /etc/logrotate.d/test_hoge /var/log/test_hoge/*.log { daily maxsize 1M⬅︎これ dateext dateformat -%Y%m%d-%s⬅︎これ missingok rotate 7 compress notifempty create 644 root root }
検証開始
検証用のログローテ設定
これで、logrotateを1時間置きに回せば、dailyでローテorサイズでローテができるはず。
$ cat /etc/logrotate.d/test_hoge /var/log/test_hoge/*.log { daily maxsize 1M missingok rotate 7 compress notifempty create 644 root root }
1Mのファイルを作る。
$ dd if=/dev/zero of=test.log bs=1M count=1 1+0 レコード入力 1+0 レコード出力 1048576 バイト (1.0 MB) コピーされました、 0.0025573 秒、 410 MB/秒 #1MBぴったりだとローテされないかもなのでちょっと足した $ echo hoge >> /var/log/test_hoge/test.log $ mv test.log /var/log/test_hoge/
ローテートを手動実行した結果、1MB以上なので、ローテされた。(あ、でもこれ当日初のローテートなので、dailyが効いてるだけかも)
$ /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf $ ls -l /var/log/test_hoge/ 合計 4 -rw-r--r--. 1 root root 0 3月 26 06:44 test.log -rw-rw-r--. 1 centos centos 1058 3月 26 06:44 test.log-20190326.gz
1M超えていない&&1日前のログをローテするか
これは普通のdailyの検証かな。
statusファイルを1日前に戻して、logrotate.statusファイルのtest.logの日時も1日前(20190325)に偽造。
5バイトのログファイルを作成
# mv /var/log/test_hoge/test.log-20190326.gz /var/log/test_hoge/test.log-20190325.gz # vim /var/lib/logrotate/logrotate.status # grep test_hoge /var/lib/logrotate/logrotate.status "/var/log/test_hoge/test.log" 2019-3-25-6:46:31 $ sudo sh -c "echo hoge>> /var/log/test_hoge/test.log" $ ls -l /var/log/test_hoge/ 合計 8 -rw-r--r--. 1 root root 5 3月 26 06:45 test.log -rw-rw-r--. 1 centos centos 1058 3月 26 06:44 test.log-20190325.gz
logrotateを手動実行した結果、statusファイル内の時刻が更新された。
# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf # grep test_hoge /var/lib/logrotate/logrotate.status "/var/log/test_hoge/test.log" 2019-3-26-6:46:31
1M超えていない&&1日前のログなのでローテされた。
"/var/log/test_hoge/test.log" 2019-3-26-6:46:31 # ls -l /var/log/test_hoge/ total 8 -rw-r--r--. 1 root root 0 Mar 26 06:46 test.log -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz
当日すでにローテ済み&&1M超えのログをローテするか
当日すでにdailyでのローテートは済んでいるが、ログファイルが1Mを超えた場合に、
cron.hourlyで実行されたlogrotateでちゃんとローテされるか。
2Mのファイルを準備
# ls -l /var/log/test_hoge/ total 2056 -rw-r--r--. 1 root root 2097152 Mar 26 07:02 test.log -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz
当日分はローテ済みなので
# date Tue Mar 26 07:04:49 UTC 2019 # grep test_hoge /var/lib/logrotate/logrotate.status "/var/log/test_hoge/test.log" 2019-3-26-6:46:31
daily or 1M超えたファイルをローテできるかがこれで分かるはず
# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf # grep test_hoge /var/lib/logrotate/logrotate.status "/var/log/test_hoge/test.log" 2019-3-26-7:6:55 # ls -l /var/log/test_hoge/ total 2056 -rw-r--r--. 1 root root 2097152 Mar 26 07:02 test.log -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz
statusは更新されたのに、ローテは走ってない。。。
rotating pattern: /var/log/test_hoge/*.log after 1 days (7 rotations) empty log files are not rotated, log files >= 1048576 are rotated earlier, old logs are removed considering log /var/log/test_hoge/test.log log needs rotating rotating log /var/log/test_hoge/test.log, log->rotateCount is 7 dateext suffix '-20190326' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' destination /var/log/test_hoge/test.log-20190326.gz already exists, skipping rotation
date suffixが被ってるからスキップされてた。。。
苦しいけど、unixtimeで回避してみる。
/var/log/test_hoge/*.log { daily maxsize 1M dateext dateformat -%Y%m%d-%s missingok rotate 7 compress notifempty create 644 root root }
これならdate suffixはまず被らない。
# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf # ls -lt /var/log/test_hoge/ total 12 -rw-r--r--. 1 root root 0 Mar 26 07:16 test.log -rw-r--r--. 1 root root 2067 Mar 26 07:02 test.log-20190326-1553584560.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz
すでにローテ済み&&1M超えのログをローテするか:again
もう一度2Mのファイルを準備。
logrotate.stausは変更しない。
# ls -lt /var/log/test_hoge/ total 2060 -rw-r--r--. 1 root root 2097152 Mar 26 07:20 test.log -rw-r--r--. 1 root root 2067 Mar 26 07:02 test.log-20190326-1553584560.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz # date Tue Mar 26 07:21:06 UTC 2019 # grep test_hoge /var/lib/logrotate/logrotate.status "/var/log/test_hoge/test.log" 2019-3-26-7:16:0
DEKITA!
# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf # ls -lt /var/log/test_hoge/ total 16 -rw-r--r--. 1 root root 0 Mar 26 07:21 test.log -rw-r--r--. 1 root root 2067 Mar 26 07:20 test.log-20190326-1553584904.gz -rw-r--r--. 1 root root 2067 Mar 26 07:02 test.log-20190326-1553584560.gz -rw-r--r--. 1 root root 25 Mar 26 06:45 test.log-20190326.gz -rw-rw-r--. 1 centos centos 1058 Mar 26 06:44 test.log-20190325.gz
おまけ
書き方ダメなやつ
*だけで指定するやつ
/home/ubuntu/tools/log/* { daily missingok rotate 3 compress notifempty }
永遠にローテされる。
-rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:06 lifecycle_action_polling_sqs_20190610000601.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:05 lifecycle_action_polling_sqs_20190610000501.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:04 lifecycle_action_polling_sqs_20190610000401.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:03 lifecycle_action_polling_sqs_20190610000301.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:02 lifecycle_action_polling_sqs_20190610000201.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:01 lifecycle_action_polling_sqs_20190610000101.log.1.1.gz.1.gz -rw-rw-r-- 1 ubuntu ubuntu 343 Jun 10 00:00 lifecycle_action_polling_sqs_20190610000001.log.1.1.gz.1.gz
当然だけど*で引っかかるからひたすらローテート対象になって、圧縮されていく。
正しくは、*.logとかだね。
(ファイルのローテート規則がおかしいのは、途中からdelaycompress外したから)