ZABBIX ログ監視について

お世話になっております。柳井と申します。

下記について解決策等の情報をお持ちの方がいらっしゃいましたら、
お手数ですが、ご教授頂ければ幸いです。

以下の条件のログファイル監視でZABBIXでログ情報が一部取得でき
ておりません。

- 毎日ログローテーションされるログファイル
- ログファイルへ出力されるログの内容はスクリプト実行時のログ
(スクリプトが失敗しない限り毎回同様のメッセージが出力される)
※スクリプト成功時は毎回ファイルサイズが同値

ZABBIXのログ監視は、zabbix_agentd から毎回監視間隔毎に、前回のログ更新か
らの差分データをZABBIXサーバへ送出しています。

この前回の更新ポイントはファイルサイズで判断しており、このため、更新され
たログファイルサイズが毎回同値の場合、zabbix_agentd がログファイルが更新
されていないと判断し、zabbix_server へログを送出していないと考えられます。

このため、監視対象のログが更新されても、ZABBIXでログを取得できません。

上記のような現象について、対応策等ございましたら、ご教授頂けますでしょうか。

以上、宜しくお願い致します。

コメント表示オプション

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

ozawaさん

この前回の更新ポイントはファイルサイズで判断しており、このため、更新され
たログファイルサイズが毎回同値の場合、zabbix_agentd がログファイルが更新
されていないと判断し、zabbix_server へログを送出していないと考えられます。

以前、zabbix1.4.2のソースを読んだ事があります。
指摘通り、ファイルサイズを先に確認しています。
また、ファイルサイズのチェックで前回よりもファイルサイズが減少しているとファイルの頭から読む仕様になっていました。

ログローテートの際、ファイルを一旦0Byteにすることはできますでしょうか?できれば、zabbixの方でログを読むことが可能となるはずです。

※:zabbix1.6系ですが現時点で私の方では未検証です。すいません。

ユーザー ozawa の写真

KAZ様

お世話になっております。柳井です。

ご連絡ありがとうございます。

一点、ローテーションのタイミングで一旦0byte にしても、
同様の検証が発生致しました。

また、ZABBIX で取得しているログである一定期間のみ欠落して
いるログもあるため、zabbix_agentd が持っているファイルサイ
ズが更新されていないことが問題かと考えています。

zabbix_agentd でファイルサイズが更新されない等情報等お持ちの
方がいらっしゃいましたら、ご教授頂ければ幸いです。

以上、宜しくお願い致します。

ユーザー KAZ の写真

ozawaさん

一点、ローテーションのタイミングで一旦0byte にしても、
同様の検証が発生致しました。

ローテーションからファイルへの書込みまでどの程度間隔を取っていますでしょうか?

「空⇒書込み⇒空⇒書込み」とファイルが遷移する場合、空と値がある状態の間隔は監視間隔の2倍あれば、大丈夫だと思います。

30秒監視でしたら、ローテーションからファイルへの書込みまでは1分ほど時間を空けないといけないかと。

ユーザー ozawa の写真

KAZ様

お世話になっております。柳井です。

ご連絡ありがとうございます。

>「空⇒書込み⇒空⇒書込み」とファイルが遷移する場合、空と値が
>ある状態の間隔は監視間隔の2倍あれば、大丈夫だと思います。

ログは毎日 00:00 にローテーションしております。
00:00 にローテーションされ、01:00 に書き込みされるログ
についても、取得できておりません。

ご参考にファイルが遷移する場合、2倍間隔を開けないといけない
理由についてご教授頂いても宜しいでしょうか。

以上、宜しくお願い致します。

ユーザー KAZ の写真

ozawaさん

ログは毎日 00:00 にローテーションしております。
00:00 にローテーションされ、01:00 に書き込みされるログ
についても、取得できておりません。

参考に監視間隔、アクセス権、ローテーション方法を御教え願えますか?

当方、CentOSで「空⇒書込み⇒空⇒書込み」を行い取得できているか検証してみたのですが、上手くいっています。
※:空にするのは「echo "" > ファイル名」としました。

ご参考にファイルが遷移する場合、2倍間隔を開けないといけない
理由についてご教授頂いても宜しいでしょうか。

例えば00時00分00秒にローテーションし、監視間隔が30秒の場合

1)前回の監視が23時59分31秒だった場合
 次回監視は00時00分01秒なのでファイルサイズ変更を感知します。
 そして次の監視タイミング(00時00分31秒)でファイルサイズが変わっていれば変更を感知します。

2)前回の監視が23時59分29秒だった場合
 次回監視は23時59分59秒なのでファイルサイズ変更を感知するのは更に次の00時00分29秒になります。
 そして次の監視タイミング(00時00分59秒)でファイルサイズが変わっていれば変更を感知します。

つまり、ローテーションの時間から監視タイミング分マージンを取ってやればzabbixが感知するのに十分であると考えられますが、cron等のローテーション動作で数十秒のズレは起きえますので、安全を見越して監視間隔2周期分を見越せば、感知漏れがある程度なくなると判断できます。(CPU過負荷等の要因で監視が遅れる場合はその限りではないですが…)

ユーザー ozawa の写真

KAZ様、皆様

お世話になっております。柳井です。

本件について、原因の特定が行えたため、ご連絡させて頂きます。

zabbix_agentd の仕様、若しくは意図していない動作と思われます。
リリースノートや、フォーラム等確認致しましたが、本件について
記載されている情報はございませんでした。本件について対応策等の情報をお
持ちの方がいらっしゃいましたら、ご教授頂ければ幸いです。

■前提条件
正常にログ監視が行えない件について、以下の条件下で発生しております。

(1) 毎日定時に実行されるスクリプトから出力されるログを監視
(2) 正常終了される場合は、毎回同様のメッセージが出力される
※ファイルサイズが同値
(3) zabbix_agentd のバージョンは 1.4.5

■原因

zabbix_agentd の以下の仕様により、ログファイルの取り込みが行えない事象
が発生致します。

(1) zabbix_agentd が最後に取り込んだファイルサイズと新たに出力された
ログファイルサイズが同値の場合

(2) 0byte の場合はzabbix_agentdがログファイルの取り込みを行わない

1) ログファイルがローテーションの際に0byte となる。
この際、zabbix_agentd の持っているファイルサイズ情報は更新
されないため、前日の最終更新ログサイズの情報を保持する。

2) 前日と同様の文字列のログが出力され、ファイルサイズが同値で
あるため、zabbix_agentd はログが更新されていないと判断し、
ログを収集しない。

■検証結果

原因の特定に辺り、検証環境にて、以下の検証を実施致しました。
test.log を監視。zabbix_agentd のdebug level を『4』として、
状態を確認。

(1) echo "1" >> test.log
--> 『zabbix で検知』

(2) echo "2" >> test.log
--> 『zabbix で検知。zabbix_agentd の持っ
ているファイルサイズ情報が更新される』

(3) cp /dev/null test.log
--> 『ファイルサイズが 0byte になる。zabbix_agentd
のログは(2)で更新されたファイルサイズのまま』

(4) echo "1" >> test.log ; echo "2" >> test.log
--> 『ファイルサイズが(2)と同様のため、ZABBIX サーバ
上で検知せず』

以上、宜しくお願い致します。

ユーザー ozawa の写真

KAZ様、皆様

お世話になっております。柳井です。

本件について、原因の特定が行えたため、ご連絡させて頂きます。

zabbix_agentd の仕様、若しくは意図していない動作と思われます。
リリースノートや、フォーラム等確認致しましたが、本件について
記載されている情報はございませんでした。本件について対応策等の情報をお
持ちの方がいらっしゃいましたら、ご教授頂ければ幸いです。

■前提条件
正常にログ監視が行えない件について、以下の条件下で発生しております。

(1) 毎日定時に実行されるスクリプトから出力されるログを監視
(2) 正常終了される場合は、毎回同様のメッセージが出力される
※ファイルサイズが同値
(3) zabbix_agentd のバージョンは 1.4.5

■原因

zabbix_agentd の以下の仕様により、ログファイルの取り込みが行えない事象
が発生致します。

(1) zabbix_agentd が最後に取り込んだファイルサイズと新たに出力された
ログファイルサイズが同値の場合

(2) 0byte の場合はzabbix_agentdがログファイルの取り込みを行わない

1) ログファイルがローテーションの際に0byte となる。
この際、zabbix_agentd の持っているファイルサイズ情報は更新
されないため、前日の最終更新ログサイズの情報を保持する。

2) 前日と同様の文字列のログが出力され、ファイルサイズが同値で
あるため、zabbix_agentd はログが更新されていないと判断し、
ログを収集しない。

■検証結果

原因の特定に辺り、検証環境にて、以下の検証を実施致しました。
test.log を監視。zabbix_agentd のdebug level を『4』として、
状態を確認。

(1) echo "1" >> test.log
--> 『zabbix で検知』

(2) echo "2" >> test.log
--> 『zabbix で検知。zabbix_agentd の持っ
ているファイルサイズ情報が更新される』

(3) cp /dev/null test.log
--> 『ファイルサイズが 0byte になる。zabbix_agentd
のログは(2)で更新されたファイルサイズのまま』

(4) echo "1" >> test.log ; echo "2" >> test.log
--> 『ファイルサイズが(2)と同様のため、ZABBIX サーバ
上で検知せず』

以上、宜しくお願い致します。

ユーザー angel の写真

柳井さん、こんにちは。

zabbix_agent側でも、ログファイルのサイズを記録しているみたい
ですね。 初めて知りました。

さて、いろいろ試してみました。
(zabbix_senderでダミー文字を送ってみるとか、エージェントを
 リスタートかけるとか・・・)

【一番お勧めの対処方法】

仕様では、前回取得したバイト数>今回取得したバイト数の場合、
ログファイルの先頭からデータを収集するのだったと思います。

ですので、ログファイルサイズを増やしてあげるという方法
ではいかがでしょうか?。

たとえば・・・

 1.100Byteのログが出力される
 2.ダミー処理で1Byteの文字をログファイルに書き込む ← 対処方法
 3.ログファイルがNULLクリアされる(0Byte)
 4.100Byteのログが出力される

※2→3の間は、監視間隔以上の時間が必要。

私はzabbix1.6.4で試してみましたが、これでうまくいきました。

以上、ご参考まで:-o

ユーザー ozawa の写真

angelさん

お世話になっております。柳井です。

ご連絡ありがとうございます。

>仕様では、前回取得したバイト数>今回取得したバイト数の場合、
>ログファイルの先頭からデータを収集するのだったと思います。
>ですので、ログファイルサイズを増やしてあげるという方法
>ではいかがでしょうか?。

私も上記の対応方法が良いと考えています。以下のようにローテー
ションスクリプトでローテーション後、数byte追加してあげることで、
対応しようと考えています。

ex)
(1) ローテーション + 1byte 追加 --> ファイルサイズ 1byte
(2) zabbix_agentd からのポーリング --> zabbix_agentd の保持しているファイルサイズが 1byte となる。
(3) 100Byteのログが出力される
(4) zabbix_agentd 101byte ログを取得。

そもそも、ファイルサイズが 0byte の時にzabbix_agentdが保持し
ているファイルサイズを0byte としない理由が、意図した仕様なのか、
意図していなかったのか気になりますが、、。

以上、宜しくお願い致します。

ユーザー KAZ の写真

柳井さん、angelさん

KAZです。
本業が忙しくRESできてませんでした、すいません。
「ファイルサイズが同じ場合は読まない」は盲点でした。
また、0Byteの場合はファイル読み込み位置が更新されないと言うのも気が付きませんでした。

これからも宜しくお願い致します。