高性能事件日志

Str*_*ill 11 c# wmi winapi event-log

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

我需要能够过滤旧日志的东西,现在我存储最后记录的事件记录ID并检索事件ID大于那个的所有记录....

我已经尝试过EventLogQuery/EventLogReader,这个工作很快,除非我想拉消息数据,为了获得安全日志的格式化消息,我需要调用EventLogRecord.FormattedMessage(),这使我的日志速度达到约150 /秒具有易于格式化的日志,更复杂的日志更糟糕.

我已经尝试过System.Diagnoistics.EventLog,这不允许我构建过滤器,所以每次运行它都必须加载所有事件日志,然后我可以解析任何重复项(从上次扫描).我有一个在过去两天内有200万个事件日志的服务器,由于这个内存使用情况变得很糟糕,所以这是不行的.

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

所以要么:

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

编辑:

我写了一篇博文,详细介绍了我对此的了解:

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

主要是:WINAPI是你最好的选择,要么写C++/CLR,要么使用PInvoke.

Mit*_*eed 2

我发现托管代码太慢,最终我使用 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

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