【发布时间】:2019-04-25 02:37:10
【问题描述】:
我想要完成的是一个 C# 应用程序,它将从 Windows 事件日志中读取日志并将它们存储在其他地方。这必须很快,因为将安装它的某些设备会产生大量的日志/秒。
到目前为止,我已经尝试了三种方法:
Local WMI:效果不好,由于需要加载的集合大小导致的错误和异常太多。 EventLogReader:我认为这是一个完美的解决方案,因为它允许您使用 XPath 表达式查询事件日志。问题在于,当您想要获取每个日志的消息内容(通过调用 FormatDescription())时,对于长时间的收集来说,时间太长了。 例如:如果我浏览它们,我可以在 0.11 秒内读取 12k 条日志。 如果我为每个日志添加一行来存储消息,则需要将近 6 分钟才能完成完全相同的操作,这对于如此少的日志数量来说是完全疯狂的。 我不知道是否可以对 EventLogReader 进行任何优化以更快地获取消息,我在 MS 文档和 Internet 上都找不到任何内容。
我还发现您可以使用名为 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);
尽管在获取消息方面速度更快,但内存使用率可能很高,我不想在部署此解决方案的设备上造成任何问题。
谁能帮我解决这个问题?我找不到任何解决方法或方法来实现这样的目标。
谢谢!
【问题讨论】:
-
the use of memory might be high and I don't want to cause any issues on the devices where this solution will get deployed.意味着用户将在移动日志时使用该应用程序?我只是使用一个任务来处理工作.. -
不,这只是意味着我不想在服务上获得 SystemOutOfMemoryException 或类似的东西,因为内存使用率很高。我只是想知道是否有比目前我能找到的更有效的解决方法。
-
这基本上将在 Windows 服务中运行,我不知道第三种方法(EventLog)是否有一种方法可以过滤日志集合,而无需读取内存中的所有内容然后应用一个 LINQ 查询。
-
我想你想使用
EventLog的构造函数:new EventLog("Security")。此外,如果它作为服务运行,我将在第一次运行期间(在后台)复制现有日志,然后在您的服务中将EntryWrittenEventHandler挂接到EventLog中以处理新创建的日志。 -
那么,您基本上是在告诉我为我需要阅读的每个日志文件订阅 EntryWrittenEventHandler?然后每次触发此事件时,我都会拥有新创建的日志,并且可以将其转发到任何我想要的地方。对吗?