Существует ли встроенный метод двоичного поиска по записям в коллекции .NET EventLog.Entries?
-
09-09-2019 - |
Вопрос
Я разрабатываю службу анализа журналов, которая фиксирует определенные события безопасности в журнале событий 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 библиотека.