複数の文字列検索によるトリガーの設定

お世話になります。

トリガーの設定についてご享受ください。
フォーラムやwebでも検索したのですが、うまく情報が見つかりませんでした。

環境:ZABBIX1.6.8
実施したいこと:
1.ZABBIXサーバーをsyslogサーバーとし、複数のネットワーク機器からZABBIXサーバーにsyslog出力
(出力内容は「LinkUP」・「LinkDOWN」の内容)
2.ZABBIXサーバー自体をエージェントとし、syslogのログ監視を実施
3.syslog内に出力される「機器名(orIP)」、「LinkUP」、「LinkDOWN」をひっかけて
 ネットワーク機器名毎のトリガーを作成

条件式としては
「syslogに『機器名』・『LinkDOWN』が出力されると「1(障害)」とし、syslogに『機器名』・『LinkUP』が出力されると「0(正常)」
を実装したいと考えています。
(ログ内の複数の文字列検索によるステータスの変更)

以下の条件式で一応「障害」・「正常」のステータス変更を確認できたのですが、あまりにも長くなってしまいます。
よりシンプルなトリガーの条件式はありますでしょうか?

({<agent名>:log[ログファイル].str(<機器名>)}&{<agent名>:log[ログファイル].str(<DOWN>)}=1)|({<agent名>:log[ログファイル].str(<機器名>)}&{<agent名>:log[ログファイル].str(UP)}=0)

コメント表示オプション

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

こんにちは。

もし、各ログの行では必ず機器名のあとにLinkDOWN/LinkUPの文字列が出力されるようであれば、

({hostname:log[logname].regexp(機器名.*linkDOWN)}=1)|({hostname:log[logname].regexp(機器名.*linkUP)}=1)

といった形で正規表現を利用して設定できると思います。

トリガー条件式が長くなることが問題であれば、1つのアイテムに対してlinkDOWNとlinkUPのトリガーを別々に設定する方法もあると思います。

ユーザー nos の写真

kodaiさん

ご回答ありがとうございます。
ご教授いただいた内容で検証してみました。

■検証内容
各機器をAIXサーバーのデーモンに見立て、/var/log/syslog.out内にデーモンの起動・停止時に出力される文字列を検索し、
「デーモンの起動⇒正常、デーモンの停止⇒障害」と判別させるためのトリガーを作成

■トリガー設定
<トリガー?>
トリガー名:named
キー:({HOSTNAME:log[/var/log/syslog.out].regexp(named.*Ready)}=0)|({HOSTNAME:log[/var/log/syslog.out].regexp(named.*shutting)}=1)
named起動時は「named[323780]: Ready to answer queries.」
停止時は「named[323776]: shutting down」と出力されるため
イベント生成:ノーマル+障害イベントを継続して生成
<トリガー?>
トリガー名:xntpd
キー:({HOSTNAME:log[/var/log/syslog.out].regexp(xntpd.*3.4y)}=0)|({HOSTNAME:log[/var/log/syslog.out].regexp(xntpd.*stop)}=1)
起動時には「xntpd[278740]: 3.4y」、
停止時には「xntpd[315632]: SRC stop issued.」と出力されるため
イベント生成:ノーマル+障害イベントを継続して生成

上記設定で、namedを起動した際にトリガーは「正常」となったのですが、続けてxntpdを起動した際にnamedのトリガーは「障害」となってしまいました。
両デーモン起動状態ではどちらのトリガーも「障害」になっています。

以下がコマンドを実行した際のsyslog.outになります。

----------------------------------------------------------
#tail -f /var/log/syslog.out
Aug 19 10:15:59 HOSTNAME daemon:notice named[323780]: starting BIND 9.2.1
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: using 1 CPU
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: loading configuration from '/etc/named.conf'
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: listening on IPv4 interface en0, 10.11.160.67#53
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: listening on IPv4 interface lo0, 127.0.0.1#53
Aug 19 10:15:59 HOSTNAMEdaemon:notice named[323780]: command channel listening on 127.0.0.1#953
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: no source of entropy found
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: zone nostest.co.jp/IN: loaded serial 2005052201
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: zone HOSTNAME/IN: loaded serial 42
Aug 19 10:15:59 HOSTNAMEdaemon:info named[323780]: Ready to answer queries.

Aug 19 10:20:36 HOSTNAMEdaemon:notice xntpd[278740]: 3.4y
Aug 19 10:20:36 HOSTNAMEdaemon:notice xntpd[278740]: tickadj = 1000, tick = 10000, tvu_maxslew = 99000
Aug 19 10:20:36 HOSTNAMEdaemon:info xntpd[278740]: precision = 21 usec

---------------------------------------------------------
想定ではどちらのトリガーも「正常」になるはずなのですが、
何か原因はお分かりになりますでしょうか。
監視データの最新データに該当する文字列がなければ「障害」のステータスになってしまうようですが、これは仕様になるのでしょうか。

ユーザー heya の写真

こんにちは。

namedのトリガーは、日本語で書くと
 「named〜Ready」という文字列が含まれていない ★
または
 「named〜shutting」という文字列が含まれている
場合に障害になるわけですよね?
つまり、
Aug 19 10:20:36 HOSTNAMEdaemon:notice xntpd[278740]: 3.4y
という行がきた場合は、★の条件に当てはまるので、namedのトリガーが障害となった、ということだと思います。

同様に、xntpdの方も、
Aug 19 10:20:36 HOSTNAMEdaemon:notice xntpd[278740]: tickadj = 1000, tick = 10000, tvu_maxslew = 99000
Aug 19 10:20:36 HOSTNAMEdaemon:info xntpd[278740]: precision = 21 usec
これらは
{HOSTNAME:log[/var/log/syslog.out].regexp(xntpd.*3.4y)}=0
この条件を満たすので、障害扱いになったのではないかと思います。

ところで、トリガーの値というのは、対象のアイテムの値が指定した条件を満たすと障害、満たさないと正常になるわけですよね?つまり、トリガーの条件をチェックするたびに障害or正常の判定がなされるわけで、この場合はログを一行一行チェックしていくことになりますよね。そうなると、shutdownと出たときに障害というのはいいとしても、関係ないログを読んだときにも強引に障害or正常のどちらかを判定しようとするわけで(上の場合強引に障害と判定される)、トリガーだけでどうこうするのは難しそうに思います。

障害用と復旧用の二つのトリガーを作って、それをアクションと組み合わせてみるほうがいいかもしれません。

例(実際に試してはいません)
トリガー named_ready
{HOSTNAME:log[/var/log/syslog.out].regexp(named.*Ready)}=0
↑普段はこのトリガーは障害になっていて、Readyが出たときだけ正常になるはず。
トリガー named_shutting
{HOSTNAME:log[/var/log/syslog.out].regexp(named.*shutting)}=1
↑同様に、普段は正常、shuttingが出たときだけ障害。

アクションのコンディション
 計算のタイプ AND
 トリガー=named_ready
 トリガーの値="正常"
アクションのオペレーション
 復旧時にしたいこと

アクションのコンディション
 計算のタイプ AND
 トリガー=named_shutting
 トリガーの値="障害"
アクションのオペレーション
 障害時にしたいこと

うーん、もっとスマートなやり方もありそうな気はするんですけどね・・・。私にはこれが限界。

ここでふと思ったんですが、アイテムの設定で「named〜Ready/shuttingを含むログだけ」みたいな設定ができればトリガーの設定は簡単になるんじゃないかなと。log[file<,regexp>]のregexpをうまく指定すればいけるんでしょうか。たとえばlog[/var/log/syslog.out,named.*(Ready|shutting)]
こんなのはどうですかね。もしうまくいくようなら、トリガーはshuttingを含むなら障害、それ以外は正常、とするだけでよくなりそうな気がします。

ユーザー nos の写真

heyaさん

ご回答誠にありがとうございます。

アイテムで絞る、ということには気づきませんでした。
確かにアイテムで該当部分(機器名のDown or UP)だけをアイテムで絞るような設定ができればいいのですが。。。。

いろいろ試してみます