使用C#读取Windows事件日志(Source!= ProviderName!= SourceName)

时间:2012-01-11 14:57:56

标签: c# .net event-log

我正在使用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中显示的消息相同的消息的正确方法是什么?

2 个答案:

答案 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”等等。