rsyslogを使って特定の文字列を含むログを特定のログファイルに出力する

2024/09/16に公開

はじめに

この記事はrsyslogのconfigについて理解を深めることを目的とした備忘録です。

タイトル通りのことを実現したいのであれば以下のような記述にすればOKです。今回はこの記述の意味を理解していこうと思います。

:msg, contains, "hogehoge" -/var/log/hogehoge.log
& stop

大雑把に表現すると、任意のアプリケーションが吐いたログにhogehogeという文字列が含まれていた場合に、hogehoge.logに書き込むための記載です。
iptablesのログをDROP, ACCEPT単位で出し分けたりする場合などに使うかなと思います。

そもそもrsyslogとは

rsyslogはログを取り扱うシステムで、クライアントとサーバーで構成されています。OS内のログ情報をクライアント側がTCP/UDP方式で送信して、サーバー側がそれを受け取ってファイルに書き込むなどの処理をします。(rsyslogのデフォルトはTCP)
この構成になっていることによってサーバー側はログメッセージの本文以外に、syslog PRIという『機能(kern, mail等)』と『重要度(info, err等)』が含まれた情報や送信元のhostnameやIPアドレス等の情報も受け取ることができます。
ログメッセージの本文以外にも送られてくる情報がある、ということだけ認識しておけば以下の内容は理解できると思います。

本題

今回取り扱う記法について3段階に分けて見ていきます。

:msg, contains, "hogehoge" -/var/log/hogehoge.log
& stop
  1. :msg, contains, "hogehoge"
  2. -/var/log/hogehoge.log
  3. & stop

まずは:msg, contains, "hogehoge"から見ていきます。

:(コロン)から始まる記法はプロパティベースのフィルターを表しており、:<プロパティ>, <フィルター条件>, <値>という文法で用います。
今回で言えばmsgがプロパティになります。これはログメッセージの本文だけをとりだすという意味になります。(参考:rsyslogのプロパティに関するドキュメント)。
containsは「値として与えられた文字列が、指定したプロパティ(今回のmsg)に存在しているか?」、という意味の条件文を表します。(参考:rsyslogのフィルター条件に関するドキュメント)
ここまでをまとめると:msg, contains, "hogehoge"は「ログメッセージの本文に"hogehoge"という文字列が含まれていたら右に書かれたアクションを実行する」というif文の役割になります。

続いて-/var/log/hogehoge.logについて見ていきます。

見た目通り、/var/log/hogehoge.logに書き込むという意味ですが、注意点は-(ハイフン)です。ある程度メモリに載せてからディスクに書き込むという非同期な書き込みとなり、パフォーマンスの改善が見込めます。一方で、すぐさまディスクに書き込まれないことで急なサーバー停止によってメモリにしか載っていなかったログが完全に消失するなどのリスクがあるため、ハイフンを使うかどうかは今のメモリ使用状況や使途、目的によって変える必要があります。

最後に& stopについて見ていきます。

&(アンド)から始まる記法は複数のアクションを指定したいときに用います。(参考:rsyslogの1セレクタに複数アクションを割り当てることに関するドキュメント)
本来、:msg, contains, "hogehoge"というif文を満たした場合に実行されるアクションは/var/log/hogehoge.logに書き込むという動作のみですが、&をつけることで追加のアクションを実行することができます。
今回、追加で実行したいのがstopで、アクションとしては破棄です。(参考:rsyslogの破棄アクションに関するドキュメント)rsyslogはconfigを上から下に解釈しながら実行してくれるのですが、stopによって/var/log/hogehoge.logに書き込んだ後、ほかのログには書き込まないようにしてくれます。反対に、stopを書かなかった場合、このconfigよりも下に書かれていることが多い/var/log/messages等のOS全体のログを管理するファイルと/var/log/hogehoge.logで2重のログ出力がされてしまうことになります。
なお、stop~(チルダ)と書くこともでき、古いOSなんかでは、~しか使えなかったりします。ですが、新しめのOSではstopと書かないと警告が出たりするため、今後のことを考えるとstopで書いておくのが安定な気がします。

まとめ

今回はrsyslogの記法についてまとめました。
分かっているつもりで思った以上にノリで書いてしまっていたんだなぁ、と感じるいい機会になりました。
mail.infoのように『機能』と『重要度』で指定することも多い一方で、もっと詳細に出し分けたいときにはこれからも結構使う気がしています。

この記事が少しでもお役に立てば幸いです。

ほな。

Discussion