我一直在尝试各种方法以批量获取事件日志数据(1000+条/秒)。
我需要一些可以过滤旧日志的东西,现在我存储了最后记录的事件记录ID,并检索所有事件ID大于该ID的记录...
我尝试了EventLogQuery/EventLogReader,这个方法速度很快,但是当我想要提取消息数据时就变慢了。为了获取安全日志的格式化消息,我需要调用EventLogRecord.FormattedMessage(),这会使我的日志速度减慢到每秒约150条,即便是易于格式化的日志也会更差。
我尝试了System.Diagnostics.EventLog,这个方法不允许我构建过滤器,所以每次运行此方法都必须加载所有事件日志,然后我可以解析任何重复项(从上次扫描开始)。我有一个服务器,在过去的两天中有200k个事件日志,由于这个原因内存使用情况变得可怕,所以这是不行的。
我尝试了WMI,使用System.Management.ManagementObjectCollection,这个方法具有过滤功能,可以快速地从安全事件日志中提取消息数据(接近每秒1000条),但是它会到达大约50/60k并开始变慢,最终只能做大约1-2条/秒,最终我会得到Quota Violation错误。
所以要么:
有没有办法避免配额违规错误,或者我应该使用其他方法来以这样的速度获取事件日志?
编辑:
我写了一篇关于此的博客文章:
http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/
总的来说:WINAPI是您最好的选择,可以编写C++/CLR或使用PInvoke。