LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-28

概要

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7