【RHEL】logrotateが手動では動くけど、自動(anacron)だと動かない事象について

## はじめに
他にも同様の内容を書いていらっしゃる方はちらほらいらっしゃいましたが、本事象の解決に数日かかったので後学のために書き残します。

:::note info
なお、logrotateのディレクティブ設定やlogrotate.conf、logrotate.dといった内容に関しては、詳細には本記事では紹介しません。
:::
## 環境
サーバ：Amazon EC2
OS：RHEL8.9

## 問題
とあるサーバにおいて、とあるログ（仮に/opt/logs/backup_hoge.logとする）を以下の①～④の通りlogrotateを使って世代管理する設定をしていました。

①ローテーション設定
```
[root@hogeserver]cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
daily

# keep 4 weeks worth of backlogs
rotate 365

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may be also be configured here.
```
②ローテート対象ファイル（backup_hogeを新規作成し中身を設定）
```
[root@hogeserver]cat /etc/logrotate.d
合計 52
drwxr-xr-x.  2 root root  162  5月  8 15:24 .
drwxr-xr-x. 85 root root 8192  5月  7 11:30 ..
-rw-r--r--.  1 root root   61  5月  8 10:38 backup_hoge 
-rw-r--r--.  1 root root  130  1月  5  2023 btmp
-rw-r--r--.  1 root root  160 12月 16  2021 chrony
-rw-r--r--.  1 root root   88  4月 13  2021 dnf
-rw-r--r--.  1 root root  105  9月 20  2023 insights-client
-rw-r--r--.  1 root root  162  2月  1 18:41 kvm_stat
-rw-r--r--.  1 root root  237  1月 11 02:50 sssd
-rw-r--r--.  1 root root   88  9月 14  2023 subscription-manager
-rw-r--r--.  1 root root  226  6月  7  2023 syslog
-rw-r--r--.  1 root root  145  2月 19  2018 wtmp
```

・③hoge.logに対するローテーション設定
```
[root@hogeserver]cat /etc/logrotate.d/backup_hoge
/opt/logs/backup_hoge.log
{
    missingok
}
```
・④backup_hoge.logの出力場所
```
[root@hogeserver]ls /opt/logs
backup_hoge.log
```

上記から読み取れるbackup_hoge.logに対する設定の内容としては、以下の通りです。
* 日次でローテーション（daily）
* 1年間保存（rotate 365）
* ローテーション後にからファイルを生成（create）
* ローテーションしたログの末尾に-yyyymmddの日付を付与（dateext）
* ローテーションしたログをgzipで圧縮（compress）
* ログファイルが存在しなくてもエラーを出さずに処理をする（missingok）

なので、本来であれば以下のようにローテートされるはずでした。
```
[root@hogeserver]ls /opt/logs
backup_hoge.log
backup_hoge-20240501.gz
backup_hoge-20240502.gz
backup_hoge-20240503.gz
```

しかし、数日たってもローテートされておらずオリジナルのbackup_hoge.logにログが追記され続けていました。
```
[root@hogeserver]ls /opt/logs
backup_hoge.log ←ここに書き込まれ続ける
```
ただ、/var/log配下の/var/log/messagesや/var/log/cronといったデフォルトでローテート設定がされているログに関してはローテートができておりました。
そしてさらに言えば、以下コマンドで手動ローテートを行えばローテートすることは可能でした。
```
[root@hogeserver]ls /opt/logs
backup_hoge.log

# 手動実行（実際にはlogrotate.statusの時刻を一時的にまき戻してから実行）
[root@hogeserver]logrotate -f /etc/logrotate.conf

[root@hogeserver]ls /opt/logs
backup_hoge.log
backup_hoge-20240501.gz
```

つまり、***手動だったらlogrotateが動くけど、自動（anacron）だと動かないという事象に陥ったというわけです。***

一体なぜでしょうか。

## 解決の糸口
前回のログローテートがいつ行われたかを示す/var/lib/logrotate/logrotate.statusというファイルが存在するのですが、その中身を確認したところbackup_hoge.logのローテートはちゃんと行われていました。（ここでは20240501-3:00に行われたとします）
そこで、backup_hoge.logの前回のログローテート時刻の/var/log/messages を確認したところ、以下のメッセージが出力されていました。
```
[root@hogeserver]cat /var/log/messages
~中略~
20240501-03:00:00 ALERT exited abnormally with [1] 
```
調べたところ、どうやらlogrotateがうまく動いていない時に出るログのようです。

## 原因
調べていくと、RHELの公式KBにも情報があったのですがSELinux の機能によって意図した通りにローテーションが行われていないことが原因でした。
より詳細に言えば、***SELinuxが有効の場合、/var/log/以外のディレクトリではlogrotateによるローテーションが拒否されてしまうというものでした。***
（SELinux が Enforcing モード(有効)の場合、実行プロセスやファイルのコンテキストによってはファイルのアクセスが失敗する）

https://access.redhat.com/solutions/39006

## 対処方法
SELinuxを無効化します。
恒久的に無効化したかったので、/etc/selinux/configを直接変更し再起動しました。
そして翌日、backup_hoge.logが無事ローテートされていることを確認できました。

めでたしめでたし。

:::note warn
・さいごに
SELinuxを有効のままにしたいなら、対象ログファイルを/var/log配下に移動すればよいという情報も確認しましたが、筆者の方では動作確認していません。
:::