Высокопроизводительный журнал событий - PullRequest
11 голосов
/ 04 августа 2011

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

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

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

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

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

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

Например, допустим, вы хотите, чтобы все события с идентификатором 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, так как эта утилита также записывает ошибки в этот вывод.

2 голосов
/ 05 августа 2011

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

...