Edited at

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

More than 1 year has passed since last update.


概要

Linuxのlogrotateコマンドによるログ改廃を行う際の世代数はrotatemaxageによって指定できますが、

その際の挙動を備忘として残します。


環境

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に指定する形となります。