我想要实现一个C#应用程序,它将从Windows事件日志中读取日志并将其存储在其他地方。这必须很快,因为安装了该应用程序的某些设备会生成大量日志。
到目前为止,我尝试了三种方法:
1. 本地WMI:它效果不好,由于需要加载的集合太大而导致太多错误和异常。 2. EventLogReader:我认为这是完美的解决方案,因为它允许您使用XPath表达式按照自己的喜好查询事件日志。问题是,当您想要获取每个日志的消息内容(通过调用FormatDescription())时,对于长集合来说需要太长时间。 例如:如果我只是遍历它们,我可以在0.11秒内读取12k个日志。 如果我添加一行代码来存储每个日志的消息,完全相同的操作需要近6分钟才能完成,这对于如此少量的日志来说完全疯狂。 我不知道是否有任何优化可以对EventLogReader进行,以便更快地获取消息,我在MS文档和互联网上都找不到任何信息。
3. 我还发现可以使用名为EventLog的类来读取日志条目。然而,这项技术不允许您输入任何过滤器,因此您基本上必须将整个日志列表加载到内存中,然后根据需要进行过滤。以下是一个示例:
到目前为止,我尝试了三种方法:
1. 本地WMI:它效果不好,由于需要加载的集合太大而导致太多错误和异常。 2. EventLogReader:我认为这是完美的解决方案,因为它允许您使用XPath表达式按照自己的喜好查询事件日志。问题是,当您想要获取每个日志的消息内容(通过调用FormatDescription())时,对于长集合来说需要太长时间。 例如:如果我只是遍历它们,我可以在0.11秒内读取12k个日志。 如果我添加一行代码来存储每个日志的消息,完全相同的操作需要近6分钟才能完成,这对于如此少量的日志来说完全疯狂。 我不知道是否有任何优化可以对EventLogReader进行,以便更快地获取消息,我在MS文档和互联网上都找不到任何信息。
3. 我还发现可以使用名为EventLog的类来读取日志条目。然而,这项技术不允许您输入任何过滤器,因此您基本上必须将整个日志列表加载到内存中,然后根据需要进行过滤。以下是一个示例:
EventLog eventLog = EventLog.GetEventLogs().FirstOrDefault(el => el.Log.Equals("Security", StringComparison.OrdinalIgnoreCase));
var newEntries = (from entry in eventLog.Entries.OfType()
orderby entry.TimeWritten ascending
where entry.TimeWritten > takefrom
select entry);
虽然消息传递速度更快,但内存使用可能很高,我不想在部署此解决方案的设备上出现任何问题。
有人能帮我吗?我找不到任何解决方法或可行方案。
谢谢!
EventLog
的构造函数:new EventLog("Security")
。此外,如果它作为服务运行,我建议在第一次运行时(在后台)复制现有的日志,然后在你的服务中钩取EventLog
中的EntryWrittenEventHandler
来处理新创建的日志。 - Jevgeni Geurtsen