syslogの溢れ対策

CentOS/RHEL 7になってsyslogもsystemd式に切り替わった。
ところが新しいロギングには問題があって、大量のログが発生した場合は、記録できず溢れてしまう。

実際に起こった例を挙げてみよう。
あるメールサーバの/var/log/messagesに下記メッセージが出力され、それ以降ログが記録されなくなってしまった。

メッセージは、5689件のログが溢れ、/var/log/maillogに記録されなかったことを意味している。


解説

CentOS/RHEL 7のロギングは、journaldとrsyslogの2つのプロセスが担当している。
役割はそれぞれ以下。

  • journald:各プロセスからのメッセージを収集
  • rsyslog:journaldに収集されたものを、syslogメッセージとして記録

つまり、journaldが集めて(必要なものは)rysyslogが記録する。

デフォルト設定では、この2つのプロセスは記録件数に制限をかけている。
これが溢れる原因だ。

man journald.confより抜粋

(≒journaldのデフォルトでは30秒で1000メッセージまで記録。それ以上は破棄)

rsyslog.comより抜粋

(≒rsyslogのデフォルトでは600秒で20000メッセージまで記録。それ以上は破棄)


対策

記録件数を変えるには、/etc/systemd/journald.confを変更すればいい。
RateLimitIntervalの範囲時間内で、許容する記録件数をRateLimitBurstで指定する。

以下の例だと30秒で10000メッセージまで記録する設定になる。

/etc/systemd/journald.conf

もちろんjournaldだけでなくrsyslogも変更しておこう。

/etc/rsyslog.conf

変更が終わったら反映させる。


最後にテストしておく。

/etc/rsyslog.d/test.conf

反映させる。

テスト用のコマンドを用意した。

結果:/var/log/testlogに1~1001までが表示される。


Tips

Tips 1
設定値を考えるのが面倒な場合は、以下にすれば無条件ですべて記録する。

/etc/systemd/journald.conf

/etc/rsyslog.conf

※変更が終わったら反映させる。


Tips 2
Qiitaでこのあたりをまとめてくれている人がいたので参考にどうぞ。

Qiita:CentOS7(RHEL7)でmaillogが正常に出力されなかったときの対応
http://qiita.com/kitaji0306/items/34efc0efd91e849c0fe9