ログファイル最終行の検査
お世話になります。
1日1回のチェックでファイルの最終行に"正常終了"の文字を含む行があれば正常、なければ(行が出力されない場合)アラートしたいです。
最初はlogアイテムで"正常終了"のみ取得し、nodata(90000)トリガーで実現しようとしましたが、
トリガーのステータスが不明(cannot evaluate function)になってしまい、うまく動作しません。
試した限り、nodata(300)など小さい値だと、正常に動作するのですが、仕様による制限でしょうか?
Zabbixのバージョンは2.2.8です。
また、もし仕様だとして別の方法で検知させるやり方があればご教授頂けないでしょうか。
最終行だけを検査対象にするというのがうまくできませんでした。
heya - 投稿数: 319
nodata の方は分かりませんが、そのログファイルが 64KB を超えないのであれば
アイテムのキー vfs.file.contents[ファイル]
トリガーの条件式 {ホスト:vfs.file.contents[ファイル].regexp("正常終了")}=1
みたいな感じでいけると思います。ただ、この正規表現だと最後の行ではなく、ファイルのどこかに「正常終了」が含まれれば真になります。最後の行でないと困るなら "正常終了[^\n]*\n$" とすればできるかもしれませんが、うまくいかないような気がします(試してません)。
#$ がファイルの最後なのか行末なのか、そこが問題。
#man 7 regex では '$' (matching the null string at the end of a line) とあります。
#これを見る限りだと行末のような気がするんですよね。
あとは全然別の方法として、ユーザーパラメーターを使って
zabbix_agentd.conf UserParameter=xxx,tail -n 1 ファイル
アイテムのキー xxx
トリガーの条件式 {ホスト:xxx.str("正常終了")}=1
とするのがシンプルかもしれません。
iga - 投稿数: 6
ありがとうございます。
ただ、ファイルは追記されていくため、64KBを超える可能性があります。
ユーザーパラメータは最終手段として、できるだけ設定しないで実現したいです。
似たような方法でvfs.file.regmatchのstart lineパラメータを常に最終行に固定できれば、
うまくできるような気がしますが、そのような指定をすることは可能でしょうか?
heya - 投稿数: 319
vfs.file.regmatch なんてのもあったんですね。気づかなかった。
ただ、説明を読んだ限りでは、行数が分からない以上「start lineパラメータを常に最終行に固定」というのは無理そうな気がします。
でも、nodata でできそうな気はしますけどね・・・。
参考までに、トリガーの条件式を書いてみると、誰か答えてくれるかもしれませんよ。