2012-01-11 27 views
3

我正在使用C#讀取Windows事件日誌,我想從中選擇/篩選條目。問題是,事件查看器中顯示的信息並不總是與我從c#獲得的數據匹配。用C#讀取Windows事件日誌(Source!= ProviderName!= SourceName)

例如:

事件查看器 「源代碼」:「用戶配置文件服務」

使用EventLogEntry類:房產 「來源」:「微軟Windows用戶配置文件服務」

使用EventLogReader類:Property「ProviderName」:「Microsoft-Windows-User Profiles Service」

使用WMI:「SOURCENAME」:「微軟Windows用戶配置文件服務」

我需要能夠讀取在事件查看器中顯示的確切信息,在哪裏可以得到這些信息?


讀取事件日誌消息...

當使用EventLogEntry類我偶爾得到以下字符串讀取事件日誌消息:

事件ID「XXX」的描述中源「xxx」找不到

再次,這與EventViewer中顯示的消息不匹配...我嘗試使用事件LogReader.FormatDescription()方法,它給了我正確的(與EventViewer相同的)消息,但對於某些條目,它只是返回null,而EventLogEntry.Message包含正確的文本。

檢索事件的消息以獲取與EventViewer中顯示的消息相同的消息的正確方法是什麼?

+0

去@Gregory一個Beamer,我主要把東西放在日誌裏,但是一旦我想出來,.net類就可以正常工作。 WMI,我發現它很麻煩。 – 2012-01-11 22:13:25

回答

2
var eventLog = new EventLog("logName", "machine", "source"); 
foreach(var entry in eventLog.Entries) 
{ 
} 

這是一個相當基本的噱頭與日誌交互。如果您需要更深入地過濾該源,則可以在條目上編寫一個LINQ查詢。如圖所示here

至於錯誤,一個常見原因是沒有正確訪問相關框中的事件和/或註冊表。由於您可以在EventViewer中看到有問題的數據,因此我懷疑權限錯誤是一種很好的可能性。

+1

這也是我的第一個方法,但事實證明,EventLogEntry類的「Source」屬性並不總是與EventViewer中的「Source」列匹配。在源代碼「xxx」中找不到「事件ID」xxx「的描述」消息「文本的問題」在使用您的代碼時發生。 – flayn 2012-01-12 09:07:22

1

看起來事件查看器的「源」列中顯示的「源」字符串是縮寫的。另外,當你嘗試在C#中創建一個EventLog時,只有日誌類型很重要,例如「應用程序」,「系統」等。創建EventLog後,它將包含該日誌類型的所有條目,而不管您指定的源是什麼。

爲了獲得基於「源」的事件,您希望迭代條目並僅篩選該「源」的條目。請記住,實際源名稱與您在事件查看器中看到的名稱不同。例如對於Source「Winlogon」,實際源名稱將爲:「Microsoft-Windows-Winlogon」等。