rsyslogで特定ログだけ送信する設計例

  • URLをコピーしました!

rsyslog を使ったログ転送で、

  • すべてのログを送る必要はない
  • 特定アプリや重要ログだけ集約したい
  • ノイズを減らして可視性を上げたい

という要件は、実務では非常に多くあります。

しかし「とりあえず if で分ける」だけでは、

  • 重複送信
  • 想定外ログの混入
  • 将来的な設定破綻

を招きがちです。

本記事では、

  • rsyslogで特定ログだけ送信するための設計思想
  • 安全な分岐設計パターン
  • 実務で使える設定例
  • 正しく動いているかの確認方法

を、運用目線で解説します。

目次

まず考えるべき:何を「送らないか」を決める

rsyslog設計で最初にやるべきなのは、

「送るログ」ではなく「送らないログ」を明確にすること

です。

これを決めずに条件を書くと、設定が複雑化します。

設計パターン1:特定プログラムログのみ送信

要件

  • nginx と mysql のログのみ送信
  • その他のログはローカル保存のみ

設定例

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

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

# それ以外はローカルのみ
*.* /var/log/messages

重要:
stop を必ず入れ、下のルールに流さないようにします。

設計パターン2:特定レベル以上のみ送信

要件

  • error / warning 以上のみ送信
  • info 以下は送らない

設定例

if ($syslogseverity-text == "err" or $syslogseverity-text == "warning") then {
  action(type="omfwd" target="logserver" port="514")
  stop
}

大量ログ環境で特に有効な設計です。

設計パターン3:特定メッセージのみ送信

要件

  • “ERROR” を含むログだけ送信

設定例

if ($msg contains "ERROR") then {
  action(type="omfwd" target="logserver" port="514")
  stop
}

アプリケーションログの抽出に向いています。

設計パターン4:送信先ごとに完全分離

要件

  • アプリログはAサーバー
  • OSログはBサーバー

設定例

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

if ($syslogfacility-text == "auth") then {
  action(type="omfwd" target="sec-logserver" port="514")
  stop
}

ログ用途を明確に分けたい場合の王道です。

設計時に必ず守るルール

  • 例外処理は必ず上に書く
  • stop を忘れない
  • 最後に catch-all を置かない、または意識する
  • 設定は1箇所に集約する

正しく送信されているか確認する方法

設定チェック

rsyslogd -N1

テストログ

logger -t nginx test_nginx_log
logger -t sshd test_sshd_log

送信対象のみがログサーバーに届くことを確認します。

よくある失敗例

  • ifを書いたのに stop がない
  • 条件が広すぎて想定外ログが送られる
  • 設定ファイルが分散して把握できない

解決したと判断する基準

  • 必要なログだけが送信される
  • ログ量が想定通り減る
  • rsyslog再起動後も挙動が変わらない

まとめ

  • rsyslog設計は「送らない設計」が重要
  • stop を軸にログの流れを制御する
  • 設計パターン化すると事故が減る

rsyslog で特定ログだけ送信する場合、

「どのログが、どこで止まるか」

を明確に設計すれば、運用は一気に安定します。

目次