rsyslogの条件分岐(if / then / stop)の正しい書き方

  • URLをコピーしました!

rsyslog の設定で、

  • 条件分岐を書いたつもりなのに意図しないログが送られる
  • ログが重複送信される
  • 特定ログだけ送信したいのに全部飛ぶ

といった問題に直面したことはないでしょうか。

これらの多くは、if / then / stop の挙動を正しく理解していないことが原因です。

本記事では、

  • rsyslogの条件分岐の基本動作
  • if / then / stop の正しい使い方
  • よくある間違いと事故例
  • 正しく動作しているかの確認方法

を、実務視点で整理します。

目次

まず理解する:rsyslogの設定は「上から順に評価」される

rsyslog の設定は、

上から下へ、すべてのルールを順番に評価

します。

条件に一致しても、明示的に止めない限り次のルールも実行されます。

ここが多くのトラブルの原因です。

if / then の基本構文

if (条件式) then {
  action(...)
}

これは、

「条件に一致した場合、この action を実行する」

という意味で、それ以外の処理を止めるものではありません

stop を書かないと何が起きるか

典型的な事故例

if ($programname == "nginx") then {
  action(type="omfwd" target="logserver" port="514")
}

*.* action(type="omfwd" target="logserver" port="514")

この場合、

  • nginxログは if に一致
  • その後 *.* にも一致

結果として、nginxログは2回送信されます

正しい書き方:stop を必ず入れる

if ($programname == "nginx") then {
  action(type="omfwd" target="logserver" port="514")
  stop
}

*.* action(type="omfwd" target="logserver" port="514")

stop は、

「このログの処理はここで終了」

という意味です。

これにより nginx ログは if ブロック内だけで処理されます。

条件分岐でよく使う判定要素

programname

if ($programname == "sshd") then { ... }

facility / severity

if ($syslogfacility-text == "auth") then { ... }

文字列一致

if ($msg contains "error") then { ... }

複数条件も可能です。

if ($programname == "nginx" and $msg contains "error") then { ... }

条件分岐を安全に書く設計パターン

パターン1:特定ログだけ先に処理

if ($programname == "nginx") then {
  action(...)
  stop
}

if ($programname == "mysql") then {
  action(...)
  stop
}

*.* action(...)

「例外 → 共通処理」の順で書くのが鉄則です。

パターン2:送信先ごとに完全分離

if ($programname == "nginx") then {
  action(type="omfwd" target="web-log")
  stop
}

if ($programname == "mysql") then {
  action(type="omfwd" target="db-log")
  stop
}

ログの流れが明確になり、事故が起きにくくなります。

条件分岐が正しく動いているか確認する方法

設定チェック

rsyslogd -N1

テストログ送信

logger -t nginx test_nginx_log

送信先で 1回だけ記録されることを確認します。

よくある間違いまとめ

  • if を書いたら処理が止まると思っている
  • stop を入れ忘れる
  • 設定ファイルが複数に分かれて把握できていない
  • 最後の *.* が全てを飲み込む

解決したと判断する基準

  • 意図したログだけが送信される
  • 重複送信が発生しない
  • rsyslog再起動後も挙動が変わらない

まとめ

  • rsyslogは条件一致後も処理を続ける
  • stop は必須の制御構文
  • 例外処理は上、共通処理は下

rsyslog の条件分岐は、

「どこで処理を止めるか」

を意識するだけで、事故の9割は防げます。

目次