是否有内置方法来通过.NET EventLog.Entries集合中的条目进行二进制搜索?

时间:2009-04-13 15:21:14

标签: c# .net event-log binary-search

我正在开发一个日志解析服务,用于捕获Windows事件日志中的特定安全事件。我最初的想法是使用Microsoft的LogParser,但除了预先选择已知的特定实例/事件ID之外,我不会寻找任何功能。

经过一些基准测试后,我发现迭代整个.NET EventLog.Entries集合的数据提取速度比查询Microsoft的LogParser快3倍。

最终,要提取的数据将保存在SQL Server数据库中。由于该服务每天都会执行此任务,因此我希望避免重复条目,并且我需要一种方法来查找EventLog.Entries集合中尚未存在于数据库中的下一个条目。一旦我找到初始条目,我就可以开始插入数据库。

我正准备编写二进制搜索,使用数据库中最新的DATETIME时间戳字段查找此条目,并将其与TimeWrittenEventLog.Entries属性的{{1}}属性进行比较收集。我可以这样做,但我想知道是否已有内置方法来执行此搜索?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

我不知道EventLogEntryCollection,但如果您需要通用二进制搜索算法,则可以使用PowerCollections库中实现的算法。