高性能事件日志

本文关键字:日志 事件 高性能 | 更新日期: 2023-09-27 18:04:31

所以我一直在尝试各种方法来批量获取事件日志数据(1000+记录/秒)。

我需要一些可以过滤掉旧日志的东西,现在我存储最后记录的事件记录ID并检索所有事件ID大于该ID的记录....

我尝试过EventLogQuery/EventLogReader,这工作得很快,除了当我想拉消息数据,为了获得安全日志的格式化消息,我需要调用EventLogRecord.FormattedMessage(),这使我的日志速度到大约150/秒,易于格式化日志,甚至更糟的是复杂的。

我试过system . diagnostics。EventLog,这不允许我建立过滤器,所以每次我运行这个,它必须加载所有事件日志,然后我可以解析任何重复(从上次扫描)。我有一个服务器,在过去的两天里有200k的事件日志,内存使用因此变得很糟糕,所以这是一个禁忌。

我试过使用System.Management的WMI。ManagementObjectCollection,它具有过滤功能,可以快速从安全事件日志中提取消息数据(接近~1000/秒),但是它将达到大约50/60k并开始拖拽它的脚,下降到大约1-2/秒,最终我会得到配额违规错误。(

:

是否有办法避免配额违反错误,或者我想使用其他方法以这种速度提取事件日志?

编辑:

我写了一篇博文,详细说明了我从中学到的东西:

http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/

大多数情况下:WINAPI是你最好的选择,要么写c++/CLR,要么使用PInvoke。

高性能事件日志

我可能会查看命令行实用程序:

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,因为这个实用程序也会将错误写入该输出。

我发现托管代码太慢了,我最终使用win32 api来检索事件日志(本地和/或远程)。它们很容易实现,并且有很多例子说明如何做到这一点。它也会比你尝试用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

我还发现,pre-vista的API可以很好地满足我的需要,实际上比vista之后的机器上的新API表现得更好。