EvtSubscribe 関数の呼び出しタイミングと、イベントログへの書き込みタイミングが重複すると、EvtNext 関数の呼び出し時にイベントログの読み飛ばしが発生する

現象

EvtSubscribe 関数を EvtSubscribeStartAfterBookmark を用いて呼び出したタイミングと同時に、イベントログの書き込みが発生するシナリオを想定します。このシナリオの後に EvtNext 関数を呼び出した場合、該当タイミングのイベントログが取得できず、次に書き込まれたイベント ログ レコードが代わりに取得される現象が発生することがあります。

原因

EvtSubscribe 関数の呼び出しに EvtSubscribeStartAfterBookmark が用いられており、かつ、EvtSubscribe 関数に指定するブックマークが、最新のイベント ログ レコードのものである場合、Windows イベントログ サービス内では管理しているブックマークを開始地点として、その後に書き込まれたイベントのレコードを参照するような設定が行われます。ただ、この処理の途中で、他のスレッドによるイベントログ書き込み要求が行われた場合、競合によりそのイベント ログが新しく書き込まれたものとして検知されない場合があります。その結果、EvtNext 関数を呼び出した際に取得されるレコードは次に書き込まれた検知可能なレコードとなり、競合したイベントログが EvtNext 関数の結果として得られない状況が発生します。

本事象は、EvtSubscribe 関数が利用される Push Subscriptions モデル または Pull Subscriptions モデルのいずれにおいても発生する可能性があります。

回避策

イベント ログが読み飛ばされる現象自体を回避する方法はございません。

現象の発生によって本来 読み飛ばされるレコード自体を取得するためには、EvtSubscribe 関数 の呼び出し時に使用するブックマークを、最新のイベントログレコードより前に設定した上で、EvtNext 関数によりイベントのレコードを取得します。この方法により、余分なレコードが取得されますが、EvtNext 関数を繰り返し呼び出すことで読み飛ばしされたレコードを取得することが可能です。

状況

マイクロソフトでは、この問題を対象製品として記載されるマイクロソフト製品の問題として認識しています。
プロパティ

文書番号:3173513 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック