0

Windows イベント ログで特定のセキュリティ イベントをキャプチャするログ解析サービスを開発しています。私の最初の考えは、Microsoft のLogParserを使用することでしたが、事前にわかっている特定のインスタンス/イベント ID を選択する以外の機能は探していません。

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

最終的に、プルされるデータは SQL Server データベースに保存されます。このサービスは毎日この作業を行うため、エントリの重複を避けたいと考えてEventLog.Entriesいます。データベースにまだ存在しないコレクション内の次のエントリを見つける方法が必要です。最初のエントリが見つかったら、データベースへの挿入を開始できます。

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

4

2 に答える 2

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;
}
于 2009-04-14T14:48:28.950 に答える
0

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

于 2009-04-14T06:00:48.967 に答える