logrotate postrotate スクリプトの挙動確認 (/var/log/syslog)

# 環境
- Ubuntu 16.04 LTS

VirtualBoxなどで実験用の環境を用意して試したほうが良いです。

# 目的
logrotateのlogrotateスクリプトで圧縮したファイルのパスを利用したい。
ここではログファイルのうち /var/log/syslog を対象に考えることにします。

# 前提
- ローテート時にファイル名の接尾辞として日付が付与されるようにする(dateextオプション追加)
- 上記以外はpostrotateを除きlogrotateのデフォルト設定を変更しない

# 手順

実験用の環境にSSH接続して以下用途別に6つコンソールを開きます。
(1つのコンソールで頑張っても良いですが…)

1. /etc/logrotate.d/rsyslog 編集用
2. /var/log/syslog* ファイル監視用
3. デバッグログ監視
4. syslog 出力用
5. 日付インクリメント用
6. ログローテート実行用

### 1. /etc/logrotate.d/rsyslog 編集

ログローテートの設定を編集します。

```
$ sudo vi /etc/logrotate.d/rsyslog
```

ログローテートが起こった時にファイル名の接尾辞に日付が付与され、
postrotateで /var/log/logrotate.log にログを出力するようにします。

```
/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        dateext # <= 追加
        delaycompress
        compress
        su root adm # <= cron実行の際には必要かも
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate

                echo "begin------------------------------" >> /var/log/logrotate.log
                COMPRESSED_YYYYMMDD=$(date --date '1 day ago' +%Y%m%d)
                for f in $1
                do
                        echo "${f}" >> /var/log/logrotate.log
                        TARGET_LOGFILE="${f}-${COMPRESSED_YYYYMMDD}.gz"
                        echo "${TARGET_LOGFILE}" >> /var/log/logrotate.log
                        if [ -e ${TARGET_LOGFILE} ]; then
                                echo "exist !" >> /var/log/logrotate.log
                        else
                                echo "not exist..." >> /var/log/logrotate.log
                        fi
                done
                echo "end  ------------------------------" >> /var/log/logrotate.log
        endscript
}
以下省略
```

なお、Ubuntu 16.04LTSにおいて syslog グループが無いにもかかわらず、
/etc/logrotate.conf で su root syslog が設定されている問題があり、
su オプションの明示的な指定が必要かもしれません。
(今一つ、把握できていません）

```
$ less /etc/logrotate.conf

su root syslog

```

```
$ groups

ユーザー名 adm cdrom sudo dip plugdev lxd lpadmin sambashare
```

### 2. /var/log/syslog* ファイル監視

ログがローテートされていく様を監視します。

```
$ watch -n 10 "ls -l /var/log/syslog*"
```

### 3. デバッグログ監視

ログローテート時のデバッグログを監視します。

```
$ tail -f /var/log/logrotate.log
```

### 4. syslog 出力

/var/log/syslog にログを出力します。

```
$ logger aaaaaaa
```

### 5. 日付インクリメント

システム時刻を１日進めます。

```
$ sudo date --set "$(date --date '1 day')"
```

なお、実際のローテートの発動タイミングは以下で確認できます。

```
$ sudo less /etc/crontab
```

以下から6時25分に発動するとわかります。

```
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
```

こいつが発動元ですね。

```
$ ll /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 372 May  6  2015 /etc/cron.daily/logrotate
```

以下のように設定して起動することもできます。

```
$ sudo date -s "2020/01/27 06:24:59"
```

この場合、日付更新を止めておく必要があります。

```
$ sudo timedatectl set-ntp 0
```

### 6. ログローテート実行

ログローテートを強制実行します。

```
sudo logrotate -f -v /etc/logrotate.conf
```

事前に -d オプションで実際のログローテートをせずにドライランして、
権限エラー有無などを確認しておくと効率が良いと思います。
(-d 付けてることを忘れて「あれ？ログがローテートされてない？」と焦らないようにお気を付けください)

```
sudo logrotate -d /etc/logrotate.conf
```

ということで…

1 で編集し、
2, 3 の表示を確認しながら、
4, 5, 6 を繰り返す

という手順で挙動を確認します。

## 結果
手順を何度か繰り返すと…

/var/log/syslog* ファイル監視用コンソールで、
昨日日付のログファイルが圧縮されていることが確認できます。

```
Every 10.0s: ls -l /var/log/syslog*                     Tue Jan 28 23:57:39 2020

-rw-r----- 1 syslog adm   0 Jan 28 23:56 /var/log/syslog
-rw-r----- 1 syslog adm 191 Jan 26 23:55 /var/log/syslog-20200126.gz
-rw-r----- 1 syslog adm 194 Jan 27 23:56 /var/log/syslog-20200127.gz
-rw-r----- 1 syslog adm 603 Jan 28 23:56 /var/log/syslog-20200128
```

次に、デバッグログ監視コンソールでは、
logrotateスクリプトの中で圧縮されたログファイルのパスを
取得できていることが確認できます。

```
begin------------------------------
/var/log/syslog
/var/log/syslog-20200125.gz
not exist...
end  ------------------------------
begin------------------------------
/var/log/syslog
/var/log/syslog-20200126.gz
exist !
end  ------------------------------
begin------------------------------
/var/log/syslog
/var/log/syslog-20200127.gz
exist !
end  ------------------------------
```

ということで、あとは取得したパスをコマンドの引数として利用できますね。

以上です。