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