ファイル更新時間が変わっただけでは検出対象にならない?
広瀬です。
ログファイル監視について別件で質問になりますが、以下の条件になった場合、
どうもエラー検知(そもそもログを読み込まない)してくれない事に気付きました
ZABBIX Ver1.8.11
1,不定期ですが、特定時間に同じエラーが吐かれる(サイズ1234バイトと仮定します)
2,数日後の同日時間にエラーが吐かれる際に、logbackにより、ローテーション掛かかります。
→当世代ファイルがリネーム、及び過去世代は削除されます。
3,新規ファイルにログが書き込まれる(同じく、1234バイトです)
※2,3はほぼ同時(ミリ秒以下の処理です)
検知前(test.logの中身)
2012/06/05 00:22:01 LR-XXXX E-XXXXX 123456789ABCDEFG
2012/06/05 00:22:01 LR-XXXX E-XXXXX 123456789ABCDEFG
※6/5時点では初回検知しました。
~その間無し~
本日の場合(test.logの中身)
2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG
2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG
※内容は異なえど、データ長は変わらない為サイズに変化が起きない
◆検証
[user@host zabbix]$ cat zabbix2.log
2012/06/05 00:22:01 LR-XXXX E-XXXXX ABCDEFG123456789
2012/06/05 00:22:01 LR-XXXX E-XXXXX 123456789XYZABCD
[user@host zabbix]$ sudo rm zabbix2.log -rf
[user@host zabbix]$ sudo sh -c "echo '2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG' >> zabbix2.log"
[user@host zabbix]$ sudo sh -c "echo '2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG' >> zabbix2.log"
[user@host zabbix]$ ll
-rw-r--r-- 1 root root 106 6月 12 13:48 zabbix2.log
[user@host zabbix]$ cat zabbix2.log
2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG
2012/06/12 00:21:56 LR-XXXX E-XXXXX 123456789ABCDEFG
[user@host zabbix]$ ll
-rw-r--r-- 1 root root 106 6月 12 13:48 zabbix2.log
明らかに時間が変化しているが、ファイルサイズに変動が無い為、検出が
なされない。
※この場合の検出とは「最新データ」のアイテムのヒストリ情報にすら出てこない
という意味です。
個人的にこの動きはログ監視として正常な機能を果たしていない様に思えます。
logrtアイテムキー動作として、これは仕様なのかご意見頂ければ幸いです。
TNK - 投稿数: 4671
現象を確認しました。
Zabbix 1.8.13ですとsrc/zabbix_agent/logfiles.cの489行目あた
りからの処理で、以前読み込んだファイルの位置(サイズ)よりもロ
グファイルのサイズの方が小さかったら、ログファイルの最初から
読み込むように設定する処理があります。
ここで、ファイルの更新日付が、以前読み込んで処理した処理時よ
りも新しくて、ファイルのサイズが同じだった場合も、ログファイ
ルの最初から読み込むように設定するようなロジックを追加するこ
とで解決すると思われます。
logrt[]では、ログファイルをローテーションする際に旧世代を残
さず削除してしまうようなローテーションは考慮していなかったの
かもしれません。
wakaba - 投稿数: 228
TNKさん
ご返答頂、ありがとうございます。
現象の確認までいただき、大変たすかりました。
本件に関して、Ver2.0ではどうであるかは別途こちらでも確認した上で、再発があれば、
SIA側に要望をあげてみたいと思います。
> logrt[]では、ログファイルをローテーションする際に旧世代を残
> さず削除してしまうようなローテーションは考慮していなかったの
> かもしれません。
logbackの仕様かはわかりませんが、数日前のログの場合には、ローテーションする際に
そのファイルが持っている時点のmtimeをファイル名に付与し、結果的に1世代前ではなく、
それより前の世代だと解釈するため、ローテート時にファイルをまとめて消してしまう様です。
対策としては関係のないログ(ただし、logrt[]の第2引数に指定された文字列を含むこと)を
定期的に吐き出して(1時間に1回)、常に1世代前のファイルが存在できるようにすることで
回避としています。
以上です。よろしくお願いいたします。