2009-04-13 5 views
0

Windowsイベントログで特定のセキュリティイベントをキャプチャするログ解析サービスを開発しています。私の最初の考えは、MicrosoftのLogParserを使用することでしたが、私は事前に既知の特定のインスタンス/イベントIDを選択する以外の機能は求めていません。.NET EventLog.Entriesコレクションのエントリをバイナリ検索する組み込みメソッドがありますか?

いくつかのベンチマークの後で、.NETのEventLog.Entriesコレクション全体の反復処理は、MicrosoftのLogParserを照会するよりもデータを取得するのに3倍以上高速であることがわかりました。

最終的に、プルするデータはSQL Serverデータベースに保存されます。サービスは毎日この義務を果たしますので、私は重複したエントリーを避けたいと思います。EventLog.Entriesコレクションの次のエントリーがデータベースにないのを見つける方法が必要です。最初のエントリを見つけたら、データベースに挿入することができます。

私はちょうどデータベースからの最新のDATETIMEタイムスタンプフィールドを使ってこのエントリを見つけて、それをEventLog.EntriesコレクションのアイテムのTimeWrittenプロパティと比較しようとしていました。これはできますが、この検索を実行するための組み込みメソッドが既に存在するかどうかは疑問です。

答えて

1

私は組み込みの実装を見つけることができませんでしたので、私は自分を書いてしまった:

/// <summary> 
/// Performs a binary search on a specified EventLogEntryCollection's 
/// TimeWritten property 
/// </summary> 
/// <param name="entries">The collection to search</param> 
/// <param name="value">The timestamp value being searched</param> 
/// <param name="low">The lower-bound search index</param> 
/// <param name="high">The upper-bound search index</param> 
/// <returns>The index of a matching timestamp, or -1 if not found</returns> 
private int BinarySearch(EventLogEntryCollection entries, DateTime value, int low, int high) 
{ 
    if (high < low) 
     return -1; 
    int mid = low + ((high - low)/2); 
    if (entries[mid].TimeWritten > value) 
     return BinarySearch(entries, value, low, mid - 1); 
    else if (entries[mid].TimeWritten < value) 
     return BinarySearch(entries, value, mid + 1, high); 
    else 
     return mid; 
} 
0

私はEventLogEntryCollectionについてよくわかりませんが、一般的なバイナリ検索アルゴリズムが必要な場合は、PowerCollectionsライブラリに実装されているアルゴリズムを使用できます。

関連する問題