Windows Server 2008 以降ではイベントサブスクリプションで特定のコレクターサーバーにイベントログを転送することができます。
イベントサブスクリプションでイベントログを再送する方法をまとめてみたいと思います。
今回はコレクターから取得する (プル) 場合の内容となっています。
イベントサブスクリプションは
- ソース (イベントログの転送元)
- コレクター (イベントログの転送先)
で構成されます。
プッシュでもプルでも変わらないようなのですが、イベントサブスクリプションの設定はレジストリに格納されているようです。
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionEventCollectorSubscriptions] の配下にサブスクリプション単位でキーが作られます。
コレクターから取得する場合は、対象のソースコンピューターごとにキーが作成されます。
この中に有効 / 無効の設定 (Enabled) やハートビートの最終送出時間 (LastHeartbeatTime)、ログの取得情報 (Bookmark) が設定されています。
イベントサブスクリプションを操作するコマンドとして、wecutil がありますが、この辺りの細かな設定が変えられないようで、ソース単位の有効/無効の切り替えはレジストリを直接操作したほうが早そうでした。
LastHeartbieatTime はハートビートを最後に送ったタイミングになると思いますが、実際の時間を求めるためには少し変換が必要となります。
たとえば、以下のような値があったとします。
ここから日付を求めるためには、
- 1cf46e8791a3f56 の先頭に 0 をつけます。
01cf46e8791a3f56 - これを 8 桁 + 8 桁に分割します。
01cf46e8 791a3f56 - 先頭と後方の 8 桁の場所を変えます。
791a3f56 01cf46e8 - これをコマンドプロンプトから nltest /time に渡します。
エラー時などはレジストリにエラーが発生したタイミングの情報が出力されますので、時間系の情報は同様の変換で日付を確認することができます。
それでは、ここからが本題です。
イベントサブスクリプションでは、ソースに対してどこまでイベントログを取得したかの情報を先ほどのレジストリの Bookmark に保持しています。
このレジストリの中に RecordId があり、この値が対象のソースのイベントログをどこまで読み込んだかの設定になります。
イベントログには、EventRecordID を持っており、この値と上記の設定が対応しているようです。
そのため、コレクターの上記のレジストリの値を変更 (必要となる EventRecordID まで戻す) することで、イベントログを再送 (実際にはレジストリに設定した EventRecordID 以降を再取得) することができます。
なお、再送をした場合は、すでに転送されているイベントログがある場合、重複の排除はしませんので同じログが多重に書きこまれることになります。
再送だけでなく、どこまでログが受取れたのかを確認する場合もこれらのレジストリをチェックしておくとよさそうですね。