Linux（CentOS7）ログローテーションのタイミング


# Linux（CentOS7）ログローテーションのタイミング（主に初回ローテーションの動作について）

Linux（CentOS7）でのログローテーションのタイミング、特に初回ローテーションの動作にフォーカスして書かせて頂きます。

## ログローテションの実行周期設定
### ログローテーション実行周期設定ファイル
ログローテーションの実行周期は、`/etc/cron.d/dailyjobs`で定義しています。これを編集すれば、任意の時間にログローテーションが可能となります。以下はデフォルト設定ですが、日次のローテションは、04:02に実行される設定です。

```text:etc/cron.d/dailyjobs
# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# run-parts
2 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly
```
### noanacronインストール、anacronアンインストール
しかし、CentOS7では、「noanacron」をインストールし、「anacron」をインストールすることで初めて`/etc/cron.d/dailyjobs`の設定が有効になります。理由などは割愛しますがコマンドだけ記載します。インストール、アンインストールの順序にも意味がありますのでご注意ください。

```bash:noanacronインストール、anacronアンインストール
yum install cronie-noanacron        #「cronie-noanacron」のインストール
yum remove cronie-anacron           #「cronie-anacron」のアンインストール
```
## ログローテーション対象ファイル追加
ログローテーション対象ファイルは`/etc/logrotate.d/`ディレクトリ配下のファイルで指定しています。
ログローテーション対象ファイルを追加する場合は、`/etc/logrotate.d/`ディレクトリ配下の既存ファイルに追記するか、新しい設定ファイルを作成し、そこに記載します。

以下の例では、設定ファイル`/etc/logrotate.d/example`を作成し、ログローテーション対象ファイルとして`/var/log/example_access.log`と`/var/log/example_error.log`を追加しました。

```text:/etc/logrotate.d/example
/var/log/example_access.log
/var/log/example_error.log
{
    missingok
    sharedscripts
    dateext
    daily
    rotate 35
    ifempty
    compress
    delaycompress
}
```

## 初回ログローテションの動き

これで、先ほど設定した`/var/log/example_access.log`と`/var/log/example_error.log`が04:02にローテーションされるかというと、そうではありません。実際にローテーションされるのは、2日後の04:02となります。

これはログローテーションが`/var/lib/logrotate.status`に記載されている前回のローテーション日時を確認しているからです。このファイルには、`"ファイル名" "前回のローテーション日時"`が一行ずつ記載されています。

```text:/var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2018-8-30-15:0:0
"/var/log/chrony/*.log" 2018-8-30-15:0:0
"/var/log/wtmp" 2018-8-30-15:0:0
"/var/log/waagent.log" 2018-10-2-12:2:1
"/var/log/spooler" 2018-10-12-19:34:1
"/var/log/btmp" 2018-10-2-12:2:1
"/var/log/maillog" 2018-10-12-19:34:1
"/var/log/wpa_supplicant.log" 2018-8-30-15:0:0
"/var/log/secure" 2018-10-12-19:34:1
"/var/log/ppp/connect-errors" 2018-8-30-15:0:0
"/var/log/messages" 2018-10-12-19:34:1
"/var/account/pacct" 2018-8-30-15:0:0
"/var/log/cron" 2018-10-12-19:34:1
```
### 初回ログローテーションのシミュレーション
初回ログローテーションを時系列でシミュレーションしてみます。ログローテーション対象ファイル設定を追加した日時を`2018/10/12 12:00`と仮定してください。ログローテション周期は、`日次 04：02`で設定しています。

##### 0日目（2018/10/12 12:00 設定直後）
設定直後は、`/var/lib/logrotate.status`にはログローテーション対象ファイルの記載はありません

```text:/var/lib/logrotate.status（抜粋）
(/var/log/example_access.log、/var/log/example_error.logの記載はない)
```

##### 1日目（2018/10/13 04:02）
設定後、初めてのログローテーション設定時刻を迎えますが、ここでは`/var/lib/logrotate.status`にファイル名と日時を追記するのみです。日時はcronの設定時刻04:02とは関係なく、0:0:0（0時0分0秒）となります。

```text:/var/lib/logrotate.status（抜粋）
"/var/log/example_access.log" 2018-10-13-0:0:0
"/var/log/example_error.log" 2018-10-13-0:0:0
```

##### 2日目（2018/10/14 04:02）
2回目のログローテーション設定時刻では、`/var/lib/logrotate.status`にファイル名と前回のローテーション時刻の記載があり、前回のローテーションから1日以上たっているため、初めてローテションが行われます。

```text:/var/lib/logrotate.status（抜粋）
"/var/log/example_access.log" 2018-10-14-4:2:1
"/var/log/example_error.log" 2018-10-14-4:2:1
```
```text:/var/log（抜粋）
-rw-r--r--  1 root   root    373 10月 14 02:10 example_access.log
-rw-r--r--  1 root   root    399 10月 13 02:10 example_access.log-20181014
-rw-r--r--  1 root   root   1062 10月 14 01:05 example_error.log
-rw-r--r--  1 root   root   3200 10月 13 01:05 example_error.log-20181014
```

## あとがき
ログローテーションの設定をして、さあテストということで、夜間サーバを起動したままにし、翌日確認すると、ローテーションされていない。ログローテーションごときと思っていたら、ハマってしまったのでこの記事を書かせて頂きました。テスト期間が限られていると場合も多いと思いますのでお気をつけください。