いつもお世話になっております。
イベントログ監視について質問させていただきたいのですが、 ソースをざっと見た限り、前回取得したログのレコード番号を記憶しているかと思うのですが、(間違っていたらすみません。) イベントログのレコード番号が上限を超えて0に戻った場合でも 前回取得したログ以降のログを取得できるのでしょうか?
イベントログは「必要に応じてイベントを上書きする」に設定しています。 また、サーバ、エージェントとも1.8.9を使用しています。
よろしくお願いいたします。
Zabbix-JPの鈴木です。
書かれているようにZabbixはイベントログのレコード番号を記憶して、そこから読む動作をしています。 そして、現状では上限を越えた場合はイベントログが読み込めなくなるような気がします。(今読んでいて気づきました)
以下のFirstIDからLastIDの間をfor文で読む動作になっていますが、以下のロジックで最後にZabbixで読んだ位置(*lastlogsize)で上書きしています。 ----------- src/zabbix_agent/eventlog.c から抜粋 --------- if (*lastlogsize > LastID) *lastlogsize = FirstID; else if (*lastlogsize >= FirstID) FirstID = (*lastlogsize) + 1; ・・・略・・・ for (i = FirstID; i < LastID; i++) { if (SUCCEED == zbx_get_eventlog_message(wsource, eventlog_handle, i, out_source, out_message, out_severity, out_timestamp, out_eventid)) { *lastlogsize = i; break; } } ----------------------------------------------------------
Zabbixのコードでは FirstID < LastID であることを前提としていますが、MSの文書では FirstID < LastID が成り立たないことを示唆しています。 Zabbixでは GetOldestEventLogRecord() で FirstID を取得して、それに GetNumberOfEventLogRecords を足して LastID を計算しています。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363660(v=vs.85).aspx
おそらく、レコード番号が上限を超えて0に戻った場合は、LastID がオーバーフローして FirstID > LastID な状態になり、その結果for文が動作せずおそらく何も読み取られなくなると思います。 こうなった場合は、一旦Windowsのイベントログ情報を全てクリアにしないとうまく動かなくなるのではないかと考えています。
再現させることができないのでコード上での予想になりますが、少なくともレコード番号が上限を超えて0に戻った場合は考慮されていないように見えます。
現状では、以下の状況ということになると思います。 ・イベントログのレコード番号が上限に達した場合、動作が正常にログが読めなそう。 ・ログが読めなくなったら、Windowsで該当のイベントログを全てクリアするというワークアラウンドで読めるようになりそう。
もう少し調べてバグ登録を検討してみたいと思います。
鈴木さん
お世話になっております。
現状ではレコード番号が上限に近づいているサーバについては 気を付ける必要がありそうですね。
ご回答いただきありがとうございました。
アカウント名 hhayashi
Zabbix関連
tsuzuki - 投稿数: 78
Zabbix-JPの鈴木です。
書かれているようにZabbixはイベントログのレコード番号を記憶して、そこから読む動作をしています。
そして、現状では上限を越えた場合はイベントログが読み込めなくなるような気がします。(今読んでいて気づきました)
以下のFirstIDからLastIDの間をfor文で読む動作になっていますが、以下のロジックで最後にZabbixで読んだ位置(*lastlogsize)で上書きしています。
----------- src/zabbix_agent/eventlog.c から抜粋 ---------
if (*lastlogsize > LastID)
*lastlogsize = FirstID;
else if (*lastlogsize >= FirstID)
FirstID = (*lastlogsize) + 1;
・・・略・・・
for (i = FirstID; i < LastID; i++)
{
if (SUCCEED == zbx_get_eventlog_message(wsource, eventlog_handle, i, out_source, out_message,
out_severity, out_timestamp, out_eventid))
{
*lastlogsize = i;
break;
}
}
----------------------------------------------------------
Zabbixのコードでは FirstID < LastID であることを前提としていますが、MSの文書では FirstID < LastID が成り立たないことを示唆しています。
Zabbixでは GetOldestEventLogRecord() で FirstID を取得して、それに GetNumberOfEventLogRecords を足して LastID を計算しています。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363660(v=vs.85).aspx
おそらく、レコード番号が上限を超えて0に戻った場合は、LastID がオーバーフローして FirstID > LastID な状態になり、その結果for文が動作せずおそらく何も読み取られなくなると思います。
こうなった場合は、一旦Windowsのイベントログ情報を全てクリアにしないとうまく動かなくなるのではないかと考えています。
再現させることができないのでコード上での予想になりますが、少なくともレコード番号が上限を超えて0に戻った場合は考慮されていないように見えます。
現状では、以下の状況ということになると思います。
・イベントログのレコード番号が上限に達した場合、動作が正常にログが読めなそう。
・ログが読めなくなったら、Windowsで該当のイベントログを全てクリアするというワークアラウンドで読めるようになりそう。
もう少し調べてバグ登録を検討してみたいと思います。
hhayashi - 投稿数: 6
鈴木さん
お世話になっております。
現状ではレコード番号が上限に近づいているサーバについては
気を付ける必要がありそうですね。
ご回答いただきありがとうございました。