Существует ли встроенный метод двоичного поиска по записям в коллекции .NET EventLog.Entries?

StackOverflow https://stackoverflow.com/questions/744236

Вопрос

Я разрабатываю службу анализа журналов, которая фиксирует определенные события безопасности в журнале событий Windows.Моей первоначальной мыслью было использовать Microsoft ЛогПарсер, но я не ищу никаких функций, кроме выбора конкретных идентификаторов экземпляров/событий, которые уже известны заранее.

После некоторого сравнительного анализа я обнаружил, что итерация по всему .NET EventLog.Entries сбор данных осуществлялся более чем в 3 раза быстрее, чем запрос Microsoft LogParser.

В конечном итоге извлекаемые данные будут сохранены в базе данных SQL Server.Поскольку служба будет выполнять эту задачу ежедневно, я хочу избежать дублирования записей, и мне понадобится способ найти следующую запись в EventLog.Entries коллекция, которой еще нет в базе данных.Я могу начать вставку в базу данных, как только найду эту первоначальную запись.

Я как раз собирался написать бинарный поиск, чтобы найти эту запись, используя самую последнюю DATETIME поле временной метки из базы данных и сравнение его с TimeWritten свойство из предмета в EventLog.Entries коллекция.Это я могу сделать, но мне интересно, существует ли уже встроенный метод для выполнения этого поиска?

Это было полезно?

Решение

В итоге я написал свой собственный, так как не смог найти встроенную реализацию:

/// <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;
}

Другие советы

я не знаю насчет EventLogEntryCollection, но если вам нужен общий алгоритм двоичного поиска, вы можете использовать тот, который реализован в PowerCollections библиотека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top