Самый быстрый способ получить отфильтрованные журналы удаленных событий - PullRequest
1 голос
/ 03 октября 2019

Мне нужно получить несколько журналов событий (с конкретными идентификаторами) из журнала событий 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: когда я писал, что «показывающие прогресс» части не имеют значения, это потому, что я пытался удалить их (на тот случай, если причиной был вывод прогресса) без каких-либо существенных различий в скорости процесса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...