ログファイル監視時のファイル名マッチングについて

=====
OSC 2012 Tokyo/Springの時にお問い合わせを頂いていて回答でき
ていなかったものです。
=====

ログファイルを監視しているのですが、指定したファイル名に合致
しないようなファイルも開こうとしてしまい、パーミッションの問
題でそのファイルを開けずにアイテムの状態が取得不可になってし
まいます。

ファイル名のマッチングはどのように行っているのですか?

同じディレクトリに作業用に作成したファイルは読み込まないよう
にしたいのですが、改造するためにもどこでファイル名のマッチン
グ処理をしているか教えてください。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

ログファイルの監視で、ファイル名として指定していないファイル
を開こうとされてしまうということは、log[]ではなくlogrt[]を利
用されていませんか?

logrt[]を利用する場合には、引数で指定したファイルと同じディ
レクトリにあるファイルのファイル名を取得して、それらのファイ
ル名とlogrt[]の引数で指定したファイル名部分との正規表現によ
るマッチングを行います。

ファイルのリストを取得して、監視対象のファイルのリストを作成
しているのは、以下のファイルになります。

 src/zabbix_agent/logfiles.c

このファイルの436行目あたりが、取得した同じディレクトリ上の
ファイルリストから監視対象候補のリストに抽出する部分になりま
す。

さらに、ファイル名の正規表現でのマッチングは、先ほどのソース
の場所のそばにある「zbx_regexp_match()」という関数で判定して
いるようです。
この関数の返却値がNULLだとファイル名が合致していないことにな
ります。

関数zbx_regexp_match()は、

 src/libs/zbxcommon/regexp.c

で定義されています。

今回の場合、例えばアイテムのキーとして、

 logrt[/var/log/messages]

というように指定されていた場合は、/var/logディレクトリにある
messagesで始まるすべてのファイルが監視対象になりうる可能性が
あります。
ファイル名の最後に「*」などが指定されてはいませんが、明示的
にファイル名の最後であることを指定しなければ、入力された文字
までが合致すると合致していると判断されるようです。

logrt[]は、logrotateのようなログのローテーションに対応するた
めの機能ですので、それらの監視対象となる候補のファイルの更新
日時を判断し、前回新しいログが出力されていないかを処理した時
点以降に更新されたファイルを古い順に処理するようになります。

ですので、/var/logディレクトリに作業用にmessagesファイルをコ
ピーしてmessagesで始まるファイル名のファイルを作成してしまう
と、そのファイルを最初から読み込もうとしてしまいます。

そこで、

 logrt[/var/log/messages$]

とすれば、messagesの後ろに何もないものを指定できるので、

 /var/log/messages

というファイルだけに限定することができます。
しかし、これですとlog[]を利用した場合と同じになってしまい、
logrotateなどでのローテーションに対応したログ監視ができなく
なってしまいます。

ですので、改造せずに対応する方法としては、logrt[]を利用され
る場合には、同じディレクトリに作業用として正規表現で合致して
しまうようなファイル名でのファイルを作成しないようにしてくだ
さい。