Журнал событий высокой производительности

Итак, я пытался различными способами получать данные журнала событий навалом (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.

Ответ 1

Я обнаружил, что управляемый код был слишком медленным, и я закончил использование API-интерфейсов win32 для извлечения журналов событий (локальных и/или удаленных). Их достаточно просто реализовать, и есть много примеров того, как это сделать. Это также будет намного быстрее, чем все, что вы пытаетесь сделать с помощью xml.

Новый API: http://msdn.microsoft.com/en-us/library/aa385780(v=vs.85).aspx

Старый API: http://msdn.microsoft.com/en-us/library/aa363652(v=vs.85).aspx

Я также обнаружил, что API-интерфейс pre-vista работал отлично для того, что мне было нужно, и на самом деле работал лучше, чем новый API на компьютерах после Vista.

Ответ 2

Я могу заглянуть в утилиту командной строки:

C:/> Wevtutil.exe qe Application /f:XML

Документация: http://technet.microsoft.com/en-us/library/cc732848(WS.10).aspx

Он сохранит закладку и продолжит работу с закладкой, а также выполнит обработку более сложных запросов.

Например, скажем, вы хотите, чтобы все события id 1530 в группе из 1000 из последней сохраненной закладки были предварительно отображены на английском языке:

Wevtutil qe Application /f:RenderedXml /bm:bookmark.pos /sbm:bookmark.pos /c:1000 /e:Log /l:en-us /q:Event[System/EventID='1530']

Это события, которые выглядят так:

<Log>
  <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
      <Provider Name="Microsoft-Windows-User Profiles Service" Guid="{89B1E9F0-5AFF-44A6-9B44-0A07A7CE5845}"/>
      <EventID>1530</EventID>
      <Version>0</Version>
      <Level>3</Level>
      <Task>0</Task>
      <Opcode>0</Opcode>
      <Keywords>0x8000000000000000</Keywords>
      <TimeCreated SystemTime="2011-06-16T22:55:32.305140500Z"/>
      <EventRecordID>26196</EventRecordID>
      <Correlation/>
      <Execution ThreadID="4168" ProcessID="1660"/>
      <Channel>Application</Channel>
      <Computer>hostname.WORKGROUP</Computer>
      <Security UserID="S-1-5-18"/>
    </System>
    <EventData Name="EVENT_HIVE_LEAK">
      <Data Name="Detail">0 user registry handles leaked from \Registry\User\S-1-5-82: </Data>
    </EventData>
    <RenderingInfo Culture="en-US">
      <Message>Windows detected your registry file is still in use by other applications or services. The file will be unloaded now. The applications or services that hold your registry file may not function properly afterwards. DETAIL - 0 user registry handles leaked from \Registry\User\S-1-5-82: </Message>
      <Level>Warning</Level>
      <Task/>
      <Opcode>Info</Opcode>
      <Channel>Application</Channel>
      <Provider>Microsoft-Windows-User Profile Service</Provider>
      <Keywords/>
    </RenderingInfo>
  </Event>

Используя быстрый синтаксический анализатор xml, вы сможете прокручивать эти данные параллельно, производя следующую страницу результатов. Это даже не нужно записывать на диск, если вы напрямую записываете вывод процесса. Просто убедитесь, что вы также фиксируете std:: error, так как эта утилита также записывает ошибки на этот вывод.