はじめに

インフラエンジニアとして避けて通れないのが、本番環境での設定変更です。
特に rsyslog.conf の編集後、設定を反映させるためのサービス再起動が必要ですが、再起動中に発生したログが消えてしまうのではないか?という不安があります。
今回は、RHEL9.5環境において rsyslogサービスが停止している間に発生したログが起動後にどう処理されるのかを検証した手順をまとめました。

結論から言うと、journald がバッファとして機能するため、ログはドロップしません。

前提

  • OS: Red Hat Enterprise Linux release 9.5
  • サービス: rsyslog.service
  • 検証のポイント: ログの一次受取口である journald が、後続の rsyslog が不在の間にバッファとして機能するかを確認します。
  • 検証用設定: ノイズを避けるため、特定のタグ(test-tag)を持つログのみを /var/log/test_verify.log に出力する設定を追加して検証します。

検証

1. 検証用環境の準備

まず、検証用ログだけを隔離して出力するための設定ファイルを作成し、反映させます。

# 検証用設定ファイルの作成
sudo bash -c 'echo ":syslogtag, contains, \"test-tag\" /var/log/test_verify.log" > /etc/rsyslog.d/test.conf'

# 設定を反映させるための再起動
sudo systemctl restart rsyslog

このコマンドでは、「test-tagという文字が含まれているログを /var/log/test_verify.log に転送しろ」という命令を /etc/rsyslog.d/test.conf に書いています。

2. rsyslogを停止した状態でログを投入する

rsyslogを「停止」させた状態でログを投入し、ドロップが発生しないかを確認します。

手順1:rsyslogサービスを停止

# rsyslogを完全に止める
sudo systemctl stop rsyslog

手順2:サービス停止中に連続ログを投入
rsyslogが止まっている間に、連番のログを10件投げます。

# 10件のログをループで投入
for i in {1..10}; do logger -t test-tag "RHEL9.5-test-$i"; sleep 0.1; done

この時点では、出力先ファイル /var/log/test_verify.log は空のままです。

[root@arch22-yoshimura-rhel9-ec2 rsyslog.d]# cat /var/log/test_verify.log
cat: /var/log/test_verify.log: No such file or directory

3. journaldによるログ保持の確認

ログがドロップしない理由は、上流にある journald がログを受け取って保持しているからです。
rsyslogを止めたままの状態で、journald側にはログが届いていることを確認します。

# journaldのログを確認
[root@arch22-yoshimura-rhel9-ec2 rsyslog.d]# journalctl -t test-tag -n 10
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5519]: RHEL9.5-test-1
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5521]: RHEL9.5-test-2
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5523]: RHEL9.5-test-3
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5525]: RHEL9.5-test-4
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5527]: RHEL9.5-test-5
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5529]: RHEL9.5-test-6
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5531]: RHEL9.5-test-7
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5533]: RHEL9.5-test-8
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5535]: RHEL9.5-test-9
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5537]: RHEL9.5-test-10
[root@arch22-yoshimura-rhel9-ec2 rsyslog.d]#

→ 結果: RHEL9.5-test-1 から RHEL9.5-test-10 までのログが Jjournaldには存在している ことが確認できました。

4. rsyslog起動とログの転送確認

最後にrsyslogを起動させ、journaldに溜まっていたログが転送されるかを確認します。

手順1:rsyslogサービスを起動

# rsyslogを再開
sudo systemctl start rsyslog

手順2:ログが設定通りに出力されていることを確認
起動した瞬間に、journaldに滞留していた10件のログがrsyslogへ一気に転送されます。

# ログが転送されているか確認
[root@arch22-yoshimura-rhel9-ec2 rsyslog.d]# cat /var/log/test_verify.log
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5519]: RHEL9.5-test-1
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5521]: RHEL9.5-test-2
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5523]: RHEL9.5-test-3
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5525]: RHEL9.5-test-4
Mar 19 08:23:33 arch22-yoshimura-rhel9-ec2 test-tag[5527]: RHEL9.5-test-5
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5529]: RHEL9.5-test-6
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5531]: RHEL9.5-test-7
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5533]: RHEL9.5-test-8
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5535]: RHEL9.5-test-9
Mar 19 08:23:34 arch22-yoshimura-rhel9-ec2 test-tag[5537]: RHEL9.5-test-10
[root@arch22-yoshimura-rhel9-ec2 rsyslog.d]#

→ 結果: 1番から10番までの全ログ が記録され、停止中に発生したログが1件もドロップしていないことが証明されました。

まとめ

RHEL9.5 では、ログの一次受取人であるjournaldがバッファとして機能するため、rsyslogの停止および再起動でログはドロップしないことが分かりました。
RHEL9.5 において、rsyslog の再起動はログ欠損のリスクなく安全に行うことができます。