logrotateコマンドにおける世代数の指定（rotateとmaxage）

# 概要

Linuxの`logrotate`コマンドによるログ改廃を行う際の世代数は`rotate`と`maxage`によって指定できますが、
その際の挙動を備忘として残します。

# 環境

OS: Amazon Linux 2017.03

# rotateの指定

manualより抜粋

```
rotate count
       Log  files are rotated count times before being removed or mailed to the address specified in a mail directive. If
       count is 0, old versions are removed rather than rotated.

```

ローテーションされたファイルをcountに指定した数だけ保持します。
`count 7`であれば、旧世代のファイルを7つ、現行のファイルを1つ保持する形となります。


## 前提条件

### テスト用ログ

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月  9 13:59 /var/tmp/loglotatetest/test.log.2017-08-09
-rw-r--r-- 1 root root 0  8月 10 12:01 /var/tmp/loglotatetest/test.log.2017-08-10
-rw-r--r-- 1 root root 0  8月 12 23:59 /var/tmp/loglotatetest/test.log.2017-08-12
-rw-r--r-- 1 root root 0  8月 13 11:59 /var/tmp/loglotatetest/test.log.2017-08-13
-rw-r--r-- 1 root root 0  8月 14 11:59 /var/tmp/loglotatetest/test.log.2017-08-14
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/loglotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/loglotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/loglotatetest/test.log
```

### 設定ファイル

```
# cat test.conf 

/var/tmp/logrotatetest/test.log {
    daily
    missingok
    nocompress
    rotate 7
    dateext
    dateformat .%Y-%m-%d
}
```

### 現在時刻

```
# date
2017年  8月 17日 木曜日 12:02:14 JST
```

## 実行

```
# logrotate -vf test.conf 
reading config file test.conf
reading config info for /var/tmp/logrotatetest/test.log 

Handling 1 logs

rotating pattern: /var/tmp/logrotatetest/test.log  forced from command line (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/tmp/logrotatetest/test.log
  log needs rotating
rotating log /var/tmp/logrotatetest/test.log, log->rotateCount is 7
Converted ' .%Y-%m-%d' -> '.%Y-%m-%d'
dateext suffix '.2017-08-17'
glob pattern '.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
renaming /var/tmp/logrotatetest/test.log to /var/tmp/logrotatetest/test.log.2017-08-17
removing old log /var/tmp/logrotatetest/test.log.2017-08-09
```

## 結果確認

2017-08-09のファイルが削除され、旧世代ファイルは合計7つを維持することが確認できました。

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月 10 12:01 /var/tmp/logrotatetest/test.log.2017-08-10
-rw-r--r-- 1 root root 0  8月 12 23:59 /var/tmp/logrotatetest/test.log.2017-08-12
-rw-r--r-- 1 root root 0  8月 13 11:59 /var/tmp/logrotatetest/test.log.2017-08-13
-rw-r--r-- 1 root root 0  8月 14 11:59 /var/tmp/logrotatetest/test.log.2017-08-14
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/logrotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/logrotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/logrotatetest/test.log.2017-08-17
```

# maxageの指定

manualより抜粋

```
maxage count
       Remove rotated logs older than <count> days. The age is only checked if the logfile is to be  rotated.  The  files
       are mailed to the configured address if maillast and mail are configured.

```

countに指定した日数よりも古いファイルを削除すると読み取れますが、やや注意です。
maxageは`logrotate`コマンドが実行されたシステム日時を基準としていますが、例えばcountを7として「2017年8月**22**日12:00:00」に`logrotate`コマンドを実行した場合、「2017年8月**15**日12:00:00」よりも古いファイルが削除されるわけではありません。
実際には「2017年8月**14**日12:00:00」よりも古いファイルが削除されます。

最初戸惑いましたがmaxageというオプション名の通り、ファイルの「年齢」が7歳を超えるまではファイルを保持すると考えます。
「2017年8月**15**日12:00:00」に作成されたファイルは「2017年8月**22**日12:00:00」時点では7歳であり、8歳になっていません。
「2017年8月**23**日12:00:00」になってはじめて8歳になり、削除されまず。

## Case1. 前提条件

### テスト用ログ

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月 14 11:59 /var/tmp/logrotatetest/test.log.2017-08-14
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/logrotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/logrotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/logrotatetest/test.log.2017-08-17
-rw-r--r-- 1 root root 0  8月 18 12:01 /var/tmp/logrotatetest/test.log.2017-08-18
-rw-r--r-- 1 root root 0  8月 19 12:01 /var/tmp/logrotatetest/test.log.2017-08-19
-rw-r--r-- 1 root root 0  8月 20 12:01 /var/tmp/logrotatetest/test.log.2017-08-20
-rw-r--r-- 1 root root 0  8月 21 12:01 /var/tmp/logrotatetest/test.log.2017-08-21
-rw-r--r-- 1 root root 0  8月 22 11:50 /var/tmp/logrotatetest/test.log
```

### 設定ファイル

```
# cat test.conf 

/var/tmp/logrotatetest/test.log {
    daily
    missingok
    nocompress
    rotate 10
    maxage 7
    dateext
    dateformat .%Y-%m-%d
}
```

### 現在時刻

```
# date
2017年  8月 22日 火曜日 11:50:56 JST
```

## Case1. 実行

現在の時刻は「2017年8月22日11:50:56」なので一番古い「2017年8月14日11:59」のファイルはまだ8歳になってません。（7歳XXカ月）
つまりこの状態でlogrotateしても削除は行われないはずです。

```
# logrotate -vf test.conf 
reading config file test.conf
reading config info for /var/tmp/logrotatetest/test.log 

Handling 1 logs

rotating pattern: /var/tmp/logrotatetest/test.log  forced from command line (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/tmp/logrotatetest/test.log
  log needs rotating
rotating log /var/tmp/logrotatetest/test.log, log->rotateCount is 10
Converted ' .%Y-%m-%d' -> '.%Y-%m-%d'
dateext suffix '.2017-08-22'
glob pattern '.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
renaming /var/tmp/logrotatetest/test.log to /var/tmp/logrotatetest/test.log.2017-08-22
```

## Case1. 結果確認

「2017年8月14日11:59」のファイルは確かに削除されていません。

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月 14 11:59 /var/tmp/logrotatetest/test.log.2017-08-14
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/logrotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/logrotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/logrotatetest/test.log.2017-08-17
-rw-r--r-- 1 root root 0  8月 18 12:01 /var/tmp/logrotatetest/test.log.2017-08-18
-rw-r--r-- 1 root root 0  8月 19 12:01 /var/tmp/logrotatetest/test.log.2017-08-19
-rw-r--r-- 1 root root 0  8月 20 12:01 /var/tmp/logrotatetest/test.log.2017-08-20
-rw-r--r-- 1 root root 0  8月 21 12:01 /var/tmp/logrotatetest/test.log.2017-08-21
-rw-r--r-- 1 root root 0  8月 22 11:50 /var/tmp/logrotatetest/test.log.2017-08-22
```


それでは今度は削除されるケースを試してみましょう。

## Case2. 前提条件

### テスト用ログ

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月 14 11:59 /var/tmp/logrotatetest/test.log.2017-08-14
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/logrotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/logrotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/logrotatetest/test.log.2017-08-17
-rw-r--r-- 1 root root 0  8月 18 12:01 /var/tmp/logrotatetest/test.log.2017-08-18
-rw-r--r-- 1 root root 0  8月 19 12:01 /var/tmp/logrotatetest/test.log.2017-08-19
-rw-r--r-- 1 root root 0  8月 20 12:01 /var/tmp/logrotatetest/test.log.2017-08-20
-rw-r--r-- 1 root root 0  8月 21 12:01 /var/tmp/logrotatetest/test.log.2017-08-21
-rw-r--r-- 1 root root 0  8月 22 11:57 /var/tmp/logrotatetest/test.log
```

### 設定ファイル

Case1と同じです。

```
# cat test.conf 

/var/tmp/logrotatetest/test.log {
    daily
    missingok
    nocompress
    rotate 10
    maxage 7
    dateext
    dateformat .%Y-%m-%d
}
```

### 現在時刻

```
# date
2017年  8月 22日 火曜日 11:59:59 JST

```

## Case2. 実行

現在の時刻は「2017年8月22日11:59:59」なので一番古い「2017年8月14日11:59」のファイルはちょうど8歳を迎えました。
logrotateした場合、maxageは7なので削除されるはずです。

```
# logrotate -vf test.conf 
reading config file test.conf
reading config info for /var/tmp/logrotatetest/test.log 

Handling 1 logs

rotating pattern: /var/tmp/logrotatetest/test.log  forced from command line (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/tmp/logrotatetest/test.log
  log needs rotating
rotating log /var/tmp/logrotatetest/test.log, log->rotateCount is 10
Converted ' .%Y-%m-%d' -> '.%Y-%m-%d'
dateext suffix '.2017-08-22'
glob pattern '.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
renaming /var/tmp/logrotatetest/test.log to /var/tmp/logrotatetest/test.log.2017-08-22
removing old log /var/tmp/logrotatetest/test.log.2017-08-14
```

## Case2. 結果確認

「2017年8月14日11:59」のファイルは確かに削除されていますね。

```
# ls -ltr /var/tmp/logrotatetest/*log*
-rw-r--r-- 1 root root 0  8月 15 11:59 /var/tmp/logrotatetest/test.log.2017-08-15
-rw-r--r-- 1 root root 0  8月 16 09:59 /var/tmp/logrotatetest/test.log.2017-08-16
-rw-r--r-- 1 root root 0  8月 17 12:01 /var/tmp/logrotatetest/test.log.2017-08-17
-rw-r--r-- 1 root root 0  8月 18 12:01 /var/tmp/logrotatetest/test.log.2017-08-18
-rw-r--r-- 1 root root 0  8月 19 12:01 /var/tmp/logrotatetest/test.log.2017-08-19
-rw-r--r-- 1 root root 0  8月 20 12:01 /var/tmp/logrotatetest/test.log.2017-08-20
-rw-r--r-- 1 root root 0  8月 21 12:01 /var/tmp/logrotatetest/test.log.2017-08-21
-rw-r--r-- 1 root root 0  8月 22 11:57 /var/tmp/logrotatetest/test.log.2017-08-22
```

# まとめ

maxageの挙動は少しだけ注意が必要です。
なおrotateはデフォルト0なので、maxageだけで改廃を制御したい場合は、
maxageよりも大きな値をrotateに指定する形となります。