Red Hat Enterprise Linux(RHEL)8におけるロギングサービスであるrsyslogとsystemd-journaldの制限と、それらの制限値のカスタマイズ方法について解説します。
systemd-journaldとrsyslogd
systemd-journaldは、RHEL8を構成する基本的な仕組みであるsystemdの一つで、様々なログを収集するサービスです。
RHEL8ではsystem-journaldとrsyslogdの二つのサービスによって、ロギングサービスが構成されています。
システムが出力するログはsystemd-journaldが収集します。rsyslogdはjournaldのメッセージを読み取り、rsyslogdの設定に従ってファイルに保存したり、他のサーバに転送したりする処理を行います。
ログが記録されない問題
この2つのサービスは、無制限にログを記録するわけではありません。同時に記録可能なログの制限が設定されており、この制限を超えたログは記録されません。
ログを参照する必要があるのは多くの場合、そのサーバで稼働しているサービスに問題が発生した場合かと思います。その際に必要なログが残っていないと、問題の調査が行き詰まる可能性があります。
以下のようなメッセージが/var/log/messagesにあった場合、いずれかのサービスの制限に該当し、ログが記録されなかったことがわかります。
imjournal: NN messages lost due to rate-limiting (20000 allowed within 600 seconds)
あるいは以下のメッセージです。
journal: Suppressed NN messages from / ...
記録されなかったログはどうやっても取り戻すことはできません。そのため、大量のログが出力される可能性がある場合は、systemd-journaldとrsyslogdの制限値をあらかじめ大きく設定しておく必要があります。
以下に設定方法について記載します。
rsyslogdの制限設定
rsyslogdの設定ファイルは/etc/rsyslog.confです。
このファイルの$imjournalRatelimitInterval と$imjournalRatelimitBurst というパラメータにより制限を設定します。
$imjournalRatelimitInterval
制限を掛ける間隔を秒で指定します。デフォルト値は600(秒)です。
$imjournalRatelimitBurst
$imjournalRatelimitInterval の間隔に出力できるメッセージの件数を指定します。デフォルト値は20000です。
つまり、デフォルトの設定では10分間に2万件までのメッセージの受信に制限が掛かりません。
/etc/rsyslog.confを変更後、rsyslogd.serviceを再起動することで設定が反映されます。
# systemctl restart rsyslog.service
サービス再起動後、サービスが正常に起動していることを確認します。
# systemctl status rsyslog.service
rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-01-10 11:55:51 JST; 4 weeks 2 days ago
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 1984337 (rsyslogd)
Tasks: 3 (limit: 11343)
Memory: 10.5M
CGroup: /system.slice/rsyslog.service
└─1984337 /usr/sbin/rsyslogd -n
systemd-journaldの制限と設定
systemd-journaldの設定ファイルは/etc/systemd/journald.confです。このファイルのRateLimitIntervalとRateLimitBurstというパラメータにより制限を設定します。
RateLimitInterval
制限を掛ける間隔を秒で指定します。デフォルト値は600秒です。
RateLimitBurst
RateLimitIntervalの間隔に出力できるメッセージの件数を指定します。
この値のデフォルト値は20000です。つまり、デフォルトの設定では、10分間に2万件までのメッセージの受信に制限が掛かりません。
/etc/systemd/journald.confを変更後、systemd-journald.serviceサービスを再起動することで設定が反映されます。
# systemctl restart systemd-journald.service
サービス再起動後、サービスが正常に起動していることを確認します。
# systemctl status systemd-journald.service
● systemd-journald.service - Journal Service
Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static; vendor preset: disabled)
Active: active (running) since Mon 2023-11-13 12:54:12 JST; 2 months 27 days ago
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 811 (systemd-journal)
Status: "Processing requests..."
Tasks: 1 (limit: 11343)
Memory: 97.8M
CGroup: /system.slice/systemd-journald.service
└─811 /usr/lib/systemd/systemd-journald
まとめ
ログが記録されないという事態を避けるのであれば、無制限に設定すればよいのではということはどなたでも思いつくかと思います。しかし、無制限に設定することは推奨されていません。
それは、処理するログの量に比例してサーバの負荷が増えるため、無制限に設定した場合過度な負荷が発生し、そのサーバの他のサービスにも影響を与える可能性があるためです。また、ログをファイルに保存している場合、使用するディスク容量も増えることになります。
そのため、サーバのリソース使用状況などを考慮し、最適な設定をすることが必要になります。そのための判断材料として、常にサーバのリソース状態を監視することが必要になるかと思います。
またsystem-journaldとrsyslogdの両方のサービスで設定が必要なことも留意が必要です。どちらかのサービスだけ設定を変更しても、もう一方のサービスの制限で制限されてしまうことになります。
また今回は触れていませんが、保存したログのローテーションも適切に設定する必要があります。そのシステムがログをどの程度の期間保存しておく必要があるのか等をそのシステムの要件を考慮して決定する必要があります。
systemd-journaldとrsyslogd を適切な設定にすることで、サーバの安定性とトラブルシュート時に有用な情報を得ることができると思います。
参考資料
- /usr/share/doc/rsyslog
- RSYSLOG.CONF(5)
- JOURNALD.CONF(5)