hoge-hogeoのひきこもごも

インフラエンジニアだけど形を持ったインフラを触ったことがない人の徒然

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外したから)