Итак, я пробовал разные способы массового получения данных журнала событий (1000+ записей в секунду).
Мне нужно что-то, что может отфильтровать старые журналы, сейчас я сохраняю последний записанный идентификатор записи события и извлекаю все записи, где идентификатор события больше этого ....
Я пробовал EventLogQuery / EventLogReader, это работает быстро, за исключением случаев, когда я хочу получить данные сообщения, чтобы получить отформатированное сообщение для журналов безопасности, мне нужно вызвать EventLogRecord.FormattedMessage (), это приближает скорость моего журнала к примерно 150 в секунду с легким форматированием журналов, еще хуже со сложными.
Я пробовал System.Diagnoistics.EventLog, это не позволяет мне создавать фильтры, поэтому каждый раз, когда я запускаю его, он должен загружать ВСЕ журналы событий, затем я могу анализировать любые дубликаты (из последнего сканирования). У меня есть сервер, на котором за последние два дня было зарегистрировано 200 тыс. Журналов событий, из-за этого использование памяти становится ужасным, так что это не пойдет.
Я пробовал WMI с использованием System.Management.ManagementObjectCollection, он имеет фильтрацию и может извлекать данные сообщения из журнала событий безопасности FAST (приближается к ~ 1000 / секунду), однако он будет идти примерно с 50 / 60k и начнет перетаскивать это ноги, примерно до 1-2 в секунду, в конце концов я получу ошибку нарушения квоты. (
Так что либо:
Есть ли способ избежать ошибки нарушения квоты или я хочу использовать какой-либо другой метод для извлечения журналов событий с такой скоростью?
Edit:
Я написал сообщение в блоге, подробно описав то, что узнал об этом:
http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/
В основном: WINAPI - ваш лучший выбор, либо напишите C ++ / CLR, либо используйте PInvoke.