CentOS/RHEL 7になってsyslogもsystemd式に切り替わった。
ところが新しいロギングには問題があって、大量のログが発生した場合は、記録できず溢れてしまう。
実際に起こった例を挙げてみよう。
あるメールサーバの/var/log/messagesに下記メッセージが出力され、それ以降ログが記録されなくなってしまった。
1 |
Sep 17 07:14:13 mail journal: Suppressed 5689 messages from /system.slice/postfix.service |
メッセージは、5689件のログが溢れ、/var/log/maillogに記録されなかったことを意味している。
解説
CentOS/RHEL 7のロギングは、journaldとrsyslogの2つのプロセスが担当している。
役割はそれぞれ以下。
- journald:各プロセスからのメッセージを収集
- rsyslog:journaldに収集されたものを、syslogメッセージとして記録
つまり、journaldが集めて(必要なものは)rysyslogが記録する。
デフォルト設定では、この2つのプロセスは記録件数に制限をかけている。
これが溢れる原因だ。
man journald.confより抜粋
1 |
Defaults to 1000 messages in 30s. |
(≒journaldのデフォルトでは30秒で1000メッセージまで記録。それ以上は破棄)
rsyslog.comより抜粋
1 2 |
ratelimit.interval seconds (default: 600) ratelimit.burst messages (default: 20000) |
(≒rsyslogのデフォルトでは600秒で20000メッセージまで記録。それ以上は破棄)
対策
記録件数を変えるには、/etc/systemd/journald.confを変更すればいい。
RateLimitIntervalの範囲時間内で、許容する記録件数をRateLimitBurstで指定する。
以下の例だと30秒で10000メッセージまで記録する設定になる。
/etc/systemd/journald.conf
1 2 3 |
### [Journal]セクション末尾に追加する RateLimitInterval=30s RateLimitBurst=10000 |
もちろんjournaldだけでなくrsyslogも変更しておこう。
/etc/rsyslog.conf
1 2 3 |
### 末尾に追加する $imjournalRatelimitInterval 30 $imjournalRatelimitBurst 10000 |
変更が終わったら反映させる。
1 2 3 4 5 6 7 8 9 |
### jornalプロセスを再起動 systemctl status systemd-journald systemctl restart systemd-journald systemctl status systemd-journald ### rsyslogプロセスを再起動 ps auxwww | grep rsyslog systemctl restart rsyslog.service ps auxwww | grep rsyslog |
最後にテストしておく。
/etc/rsyslog.d/test.conf
1 2 3 |
### 以下の設定を入れたtest.confを作成する vi /etc/rsyslog.d/test.conf user.* /var/log/testlog |
反映させる。
1 2 3 4 |
### rsyslogプロセスを再起動 ps auxwww | grep rsyslog systemctl restart rsyslog.service ps auxwww | grep rsyslog |
テスト用のコマンドを用意した。
1 |
for i in `seq 1 1001`; do logger -p user.debug testlog ${i}; done |
結果:/var/log/testlogに1~1001までが表示される。
1 2 3 |
Sep 21 15:35:58 server user: testlog 1 ~ Sep 21 15:35:58 server user: testlog 1001 |
Tips
Tips 1
設定値を考えるのが面倒な場合は、以下にすれば無条件ですべて記録する。
/etc/systemd/journald.conf
1 2 |
### [Journal]セクション末尾に追加する RateLimitBurst=0 |
/etc/rsyslog.conf
1 2 |
### 末尾に追加 $imjournalRatelimitInterval 0 |
※変更が終わったら反映させる。
1 2 3 4 5 |
### jornalプロセスを再起動 systemctl restart systemd-journald ### rsyslogプロセスを再起動 systemctl restart rsyslog.service |
Tips 2
Qiitaでこのあたりをまとめてくれている人がいたので参考にどうぞ。
Qiita:CentOS7(RHEL7)でmaillogが正常に出力されなかったときの対応
http://qiita.com/kitaji0306/items/34efc0efd91e849c0fe9