Мне нужно получить несколько журналов событий (с конкретными идентификаторами) из журнала событий Security
с нескольких серверов.
Я распараллелил цикл сервера, и он работает нормально и ускоряется,но у некоторых из них есть стратегии -huge- retention (экспортированные файлы EVTX для полных реестров превышают 10 ГБ).
Я получаю журналы, используя цикл, подобный следующему:
var eventIds = new [] { 1, 2, 3, 4 }
var eventIdQueryStr = string.Join(" or ", eventIds.Select(x => $"EventID={x}"));
var queryXPath = $"*[System[TimeCreated[@SystemTime >= '{dateFrom:s}' and @SystemTime < '{dateTo:s}']]] and *[System[{eventIdQueryStr}]]";
using var session = new EventLogSession(
serverName,
domain,
user,
password,
SessionAuthentication.Default);
var eventsQuery = new EventLogQuery("Security", PathType.LogName, queryXPath) {Session = session};
using (var logReader = new EventLogReader(eventsQuery))
{
for (var eventDetail = logReader.ReadEvent();
eventDetail != null;
eventDetail = logReader.ReadEvent())
{
// event list is a `ConcurrentBag<EventRecord>`
_eventList.Add(eventDetail);
/* other irrelevant stuff for showing progress, not relevant to the speed of the process */
}
}
/* Parsing of the eventList here... irrelevant to the question */
Это работает, но это крайне медленно. Я получаю около 1 миллиона записей (отфильтрованных с помощью запроса xpath) в час для каждого сервера (не считая синтаксический анализ, поэтому здесь это не актуально) через VPN.
Я понимаю, что журнал событий в Windows - это неИндексируемая база данных, поэтому запрос на самом деле не ускоряет вещи (просто фильтрует их), но это самый быстрый способ, которым я мог бы воспользоваться (с несколькими различными методами, включая сброс всего реестра на удаленный сервер, копирование файла и / или синтаксический анализэто напрямую через сеть).
Есть ли что-то, чего мне не хватает, что могло бы ускорить его?
Я протестировал это как на .NET Core 3.0, так и .NET Framework 4.8 безразница в результатах вообще. Использование командной строки wevtutil
с тем же запросом xpath (с использованием /q:"<query>"
) дает аналогичную производительность, но я не могу понять, что это самое быстрое из возможных.
Серверы с большимиВ частности, это серверы с двумя xeon с большим количеством свободного ЦП и ОЗУ, так что я вполне уверен, что это не проблема с аппаратной производительностью.
Буду благодарен за любые советы
PS: когда я писал, что «показывающие прогресс» части не имеют значения, это потому, что я пытался удалить их (на тот случай, если причиной был вывод прогресса) без каких-либо существенных различий в скорости процесса