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