我正在使用C#来读取Windows事件日志,我想从中选择/过滤条目。问题是事件查看器中显示的信息并不总是与我从c#获得的数据相匹配。
例如:
EventViewer“来源”:“用户个人资料服务”
使用EventLogEntry类:属性“Source”:“Microsoft-Windows-User Profiles Service”
使用EventLogReader类:属性“ProviderName”:“Microsoft-Windows-User Profiles Service”
使用WMI:“SourceName”:“Microsoft-Windows-User Profiles Service”
我需要能够阅读EventViewer中显示的确切信息,我在哪里可以获取此信息?
阅读EventLog消息......
使用EventLogEntry类读取EventLog消息时,我偶尔会得到以下字符串:
无法找到源“xxx”中事件ID“xxx”的说明
同样,这与EventViewer中显示的消息不匹配...我尝试使用EventLogReader.FormatDescription()方法,它给了我正确的(与EventViewer相同)消息,但对于某些条目它只是简单返回null,而EventLogEntry.Message包含正确的文本。
检索事件消息以获取与EventViewer中显示的消息相同的消息的正确方法是什么?
答案 0 :(得分:2)
var eventLog = new EventLog("logName", "machine", "source");
foreach(var entry in eventLog.Entries)
{
}
这是与日志交互的一个相当基本的赃物。如果您需要更深入地过滤该源,您可以在条目上编写LINQ查询。如图所示here。
至于错误,一个常见原因是没有正确访问相关方框上的事件和/或注册表。由于您可以在EventViewer中看到有问题的数据,我怀疑权限错误很有可能。
答案 1 :(得分:1)
事件查看器中“源”列中显示的“源”字符串似乎是缩写。此外,当您尝试在C#中创建EventLog时,似乎只有logtype很重要,例如“应用程序”,“系统”等。一旦创建了EventLog,它将包含该日志类型的所有条目,无论您指定了什么来源。
为了获取基于“Source”的事件,您希望迭代条目并仅过滤该“Source”的条目。请记住,实际的源名称与您在事件查看器中看到的名称不同。例如,对于Source“Winlogon”,实际的源名称将是:“Microsoft-Windows-Winlogon”等等。