はじめに
インフラエンジニアとして避けて通れないのが、本番環境での設定変更です。
特に 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 の再起動はログ欠損のリスクなく安全に行うことができます。