c# – 高效,快速地读取Windows日志
我想要完成的是一个C#应用程序,它将从
Windows事件日志中读取日志并将它们存储在其他地方.这必须很快,因为安装它的一些设备会产生大量的日志/秒.
到目前为止,我尝试了三种方法: 本地WMI:它不能正常工作,由于需要加载的集合的大小导致错误和异常太多. 我还发现您可以使用名为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); 尽管在获取消息方面速度更快,但内存的使用可能很高,我不希望在部署此解决方案的设备上引起任何问题. 任何人都可以帮我吗?我找不到任何解决方法或方法来实现这样的事情. 谢谢!. 解决方法
我们讨论了一些关于阅读注释中现有日志的内容,可以通过访问以下内容来访问安全标记的日志:
var eventLog = new EventLog("Security"); for (int i = 0; i < eventLog.Entries.Count; i++) { Console.WriteLine($"{eventLog.Entries[i].Message}"); } 这可能不是最干净(以性能为导向)的方式,但我怀疑任何其他方法会更快,因为你自己已经通过尝试不同的技术找到了. 为了防止您将来再次遇到这种麻烦,并且因为您说您正在运行服务,我将使用EventLog类的EntryWritten事件: var eventLog = new EventLog("Security") { EnableRaisingEvents = true }; eventLog.EntryWritten += EventLog_EntryWritten; // .. read existing logs or do other work .. private static void EventLog_EntryWritten(object sender,EntryWrittenEventArgs e) { Console.WriteLine($"received new entry: {e.Entry.Message}"); } 请注意,必须将EnableRaisingEvents设置为true才能在记录新条目时触发事件.启动(例如)Task也是一个很好的做法(也是性能方面的),这样系统就不会在排队调用事件时锁定自己. 如果要检索所有新创建的事件,此方法可以正常工作,如果要检索新创建的事件但对这些事件使用查询(过滤器),则可以查看EventLogWatcher类,但在您的情况下,如果没有约束,我只是使用EntryWritten事件,因为你不需要过滤器和简单的旧简单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |