Dot-Net

如何在 Windows 事件系統中創建日誌名層次結構?

  • May 3, 2012
  • 我正在使用企業庫記錄消息。
  • 我希望將其中一些(通常是錯誤和警告)傳遞給 Windows 事件系統)。我今天通過 entlib.config 路由這些。

該解決方案有效,到目前為止,效果很好。但是,我有比這個解決方案提供給我的更多的需求。我有多個安裝應該記錄到不同的日誌,但我希望它們的名稱在事件查看器中是合乎邏輯和直覺的。但是,Windows 事件系統不能有兩個名稱中的前 8 個字元相同的類別。category-name 可以更長,但只用前 8 個字母來區分。如果發生這種情況,.Net 實際上會輸出警告:

只有自定義日誌名稱的前八個字元是重要的,並且系統上已經有另一個使用給定名稱的前八個字元的日誌。

目前我不得不求助於神秘的前綴,但我仍然面臨著多個安裝在重新命名為日誌名時相互“衝突”的危險,所以我需要一個更好的解決方案。

但是,在我電腦上的事件查看器中,我可以看到還有日誌名的層次結構——這正是我所需要的。微軟和思科顯然都找到了一種方法來做到這一點:

微軟和思科有一個層次結構

但是,如何創建這樣的日誌層次結構,每個應用程序都可以安裝多次?像這樣:

CompanyName
 ApplicationName
   Installation1
   Installation2

.NET 4 個答案

您所看到的是來自 Windows 事件跟踪 (ETW) 的通道。您可以在系統資料庫中查看相關項目HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT

要使用這些功能,您必須使用新的Windows 事件日誌功能,它取代了從 Vista 開始的事件日誌API,看起來它主要針對 C/C++ 開發。似乎其中一些是通過System.Diagnostics.Eventing 命名空間公開的。

我發現 ETW 的一個很好的概述是使用 ETW 改進調試和性能調整

好消息是看起來你可以做你想做的事。您將需要創建一個 XML 清單,其中包含提供者資訊以及將記錄的事件。然後您需要使用清單上的消息編譯器(MC.EXE!)來創建標頭、資源文件和日誌記錄類,然後註冊提供程序。

如果您下載適用於 Windows 7 和 .NET Framework 4 的 Microsoft Windows SDK,您將在Samples\winbase\Eventing\Provider\Simple\CSharp子目錄中找到一個 .NET 範例解決方案,該解決方案將引導您完成所有步驟。

雖然它確實滿足您的分層要求並且有點酷,但對於典型的業務線應用程序而言,這在復雜性方面可能有點矯枉過正。此外,消息編譯器生成的程式碼是不安全的程式碼,因此也可能是負面的。

.NET 4.5 答案

在 .NET 4.5 中,使用 EventSource 類可以更好地支持 ETW。有關介紹,請參閱Windows 高速日誌記錄:使用 System.Diagnostics.Tracing.EventSource 在 C#/.NET 中 的 ETW。EventSource 現在還支持事件日誌。有關演練,請參閱宣布 EventSource NuGet 包 - 寫入 Windows 事件日誌。基本上,在編譯時會為每個 EventSource 生成清單和清單 DLL,並且可以使用 wevtutil.exe 註冊它們。通過添加 EventSource 和 Event Log 通道支持,這種方法現在看起來是直接可行的。

最後,請注意那些對 ETW 感興趣的人,模式和實踐團隊有一個可以使用 ETW的應用程序塊語義日誌記錄應用程序塊。

引用自:https://stackoverflow.com/questions/10428158