ログ監視で、検知した件数分のログ情報をメールで通知する方法について

【現在の環境】
Rocky Linux:8.4
Zabbix Server:5.4.6
postgreSQL:13.3

アイテムとしては、指定したログファイルに正規表現でフィルタをかけており、
トリガーとしては、上記のアイテムのフィルタ条件に合致したログが、「1時間に5件以上」発生した場合に、警告をメールで通知する設定としております。
なお、監視時間と件数の閾値はマクロで設定しており、障害イベント生成モードは単一として、一度警告を通知したら復旧(1件も該当ログがない(nodata=1)状態が1時間継続)するまでは再通知はしない設定としております。

また、トリガーに対するアクションとしては、デフォルトのメッセージだと、短時間に警告が連続して発生した場合に最新の情報が出力されないため、現在はアクションのメッセージにおいて {ITEM.VALUE} を出力するよう以下のようにカスタマイズしております。(現状、ログに関するアクションは全て共通でこの設定を使用しております)
-----------------------------------
Problem started at {EVENT.TIME} on {EVENT.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Item values:{ITEM.VALUE}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
-----------------------------------

ただ、現状の設定では、トリガーにヒットした最新のログが1行だけがメール通知されるのですが、「1時間に5件以上」という条件にマッチしたログをすべてメールで通知することはできますでしょうか?

コメント表示オプション

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

試してみたわけではないため、実際にできなかったらすみません。

4 Using macros in messages

こちらの「Example 5」のやり方はどうでしょうか?

ユーザー TNK の写真

Example 5の方法は、トリガーの条件式に複数のアイテムが含まれ
ている時に、そのトリガー条件式に書かれているアイテムの順に
1,2,3と番号を付与して値を参照できるマクロの記載方法です。

質問者の方がどのようなアイテムで、どのようなトリガーの条件式
を設定されているのかがわからないので、設定方法によっては、
例えば、アイテムの設定で該当するログのみフィルタリングして取
得するようなアイテムであるならば、そのアイテムの過去の情報を
数件固定して参照するような記述をすることができます。
ただし、毎回固定した件数分だけの表示です。

先に紹介されていたリンク先のExample2と3を応用して、last()の
引数で#1、#2、#3などを使用して直近、その前、そのさらに前のア
イテムの値を参照できるようなマクロとして記述するわけです。
https://www.zabbix.com/documentation/5.4/en/manual/appendix/functions/hi...

もしも、アイテムでフィルタリングをしておらず、トリガーの条件
式でのみ障害を検知するのであれば、その障害イベントが発生した
アイテムの値をさかのぼって、「1時間に5件以上」という条件にマ
ッチしたログをすべて参照するようなマクロは存在しないので、質
問者の方が書かれているような機能は、Zabbixの機能では実現不可
能だと思います。

ユーザー hige.no.papa の写真

ご回答ありがとうございます。
トライできるのは来週になってしまいますが、現状正規表現を定義して、アイテムにてその正規表現でのフィルタリングを行い、トリガーの条件式では指定時間内での count をしているだけなので、ご提示いただいた案で出力できそうです。

ユーザー hige.no.papa の写真

皆様からご提示いただいた Zabbix 5.4 のドキュメントを参考にして、
アクションの「カスタマイズしたメッセージ」として
last(/{HOST.HOST}/{ITEM.KEY},#5)
last(/{HOST.HOST}/{ITEM.KEY},#4)
last(/{HOST.HOST}/{ITEM.KEY},#3)
last(/{HOST.HOST}/{ITEM.KEY},#2)
last(/{HOST.HOST}/{ITEM.KEY},#1)
と設定してみたのですが、last関数の結果ではなく、文字列で
last(/【ホスト名】/【アイテムのキー】,#5)
last(/【ホスト名】/【アイテムのキー】,#4)
     :
といったように出力されてしまいました。

それ以外で以下の2つも試したのですが、どちらもうまく出力されませんでした。
① last(/{HOST.HOST}/{ITEM.VALUE},#5)
 ⇒「last(/【ホスト名】/【最新のログ】,#5)」という文字列が#5~#1まで表示された。
② {last(/{HOST.HOST}/{ITEM.KEY},#5)} #last関数を {} で囲む
 ⇒ 「{last(/【ホスト名】/【アイテムのキー】,#5)}」というように {} もそのまま文字列で出力された。

last() が、文字列ではなく、last関数として実行させるためには、どのようにメッセージをカスタマイズすればよろしいのでしょうか?

ユーザー TNK の写真

マニュアルを見る限り使えるはずなのですが、5.4の環境を構築し
てみたものの、うまく展開されないようです。
https://www.zabbix.com/documentation/5.4/en/manual/config/notifications/...

5.4はサポートが終了しているので、バグであったとしても今後修
正されることはないと思います。
しかし、6.0でも不具合があるようなので、5.0の頃にできていたこ
とが現時点ではできないようです。

ZBX-21266 : {ITEM.KEY} macro does not expanded in Expression macro
https://support.zabbix.com/browse/ZBX-21266

ユーザー hige.no.papa の写真

調査していただきありがとうございます。

現状使用している 5.4 だけでなく、6.0 でも期待した通りの動作とならないことについては了解いたしました。
必要に応じてバージョンアップを検討することとさせていただきます。

ユーザー batica の写真

TNK様

Example 5の方法は、トリガーの条件式に複数のアイテムが含まれ
ている時に、そのトリガー条件式に書かれているアイテムの順に
1,2,3と番号を付与して値を参照できるマクロの記載方法です。

なるほどそういう意味なのですね。ご指摘ありがとうございます。大変勉強になりました。

hige.no.papa様

私が記載した内容は誤りでした。ご放念ください。