Dot-Net

我應該什麼時候使用 Tracing vs Logger.NET、Enterprise Library、log4net 或 Ukadc.Diagnostics?

  • January 23, 2011

如何在標準跟踪、Logger.NET、企業庫、log4net 或 Ukadc.Diagnostics 之間進行選擇?

有沒有一種情況比另一種更合適?……那會是什麼?(ASP.NET、控制台應用、Azure 雲、SOHO、企業…)

有什麼好處或壞處?

我錯過了任何其他主要的日誌框架嗎?

SO上有很多類似的問題:

你錯過了幾個常用的日誌框架。以下是常用框架的列表,您列出了其中的一些:

日誌抽象:

System.Diagnostics 外掛:

其他

來自 codeplex 的其他幾個日誌框架(我在 SO 上看到過這裡提到的):

為什麼你會選擇一個而不是另一個?這是一個艱難的。很多都是個人喜好。其中一些是技術(或功能)優勢。

任何日誌框架(尤其是第三方框架)的一個明顯缺點是支持質量。如果您對 log4net、NLog、Common.Logging 等有疑問怎麼辦?你能從這些框架的開發者那裡得到修復嗎?這可能不是非常重要,因為原始碼可用於這些框架。但是,您可能不希望僅僅為了進行修復或添加增強而“繼承”原始碼樹。我會說這些框架非常可擴展,可以通過正常的擴展點添加許多增強功能。

如果您閱讀了我在上面發布的連結,我認為可以公平地說,僅根據好評的數量,log4net 將是明顯的“贏家”。它將被更頻繁地提及為歷史上最喜歡的日誌記錄以及許多人未來會選擇使用的東西。

NLog 有它的支持者,但它似乎沒有 log4net 的滲透力或“首要”意識,儘管它們非常相似。NLog 的功能與 log4net 非常相似,並且它具有最近經歷了重要的開發週期的額外優勢。

企業庫經常被吹捧為一個不錯的選擇,但幾乎同樣經常被吹捧為一個糟糕的選擇。也許它的一些負面聲譽可能不是那麼好早期版本?也許現在好多了?

System.Diagnostics 通常被推薦為一個合理的選擇,它至少具有三個強大的好處:沒有第三方依賴,許多 Microsoft 組件都使用 System.Diagnostics 進行檢測,它很容易擴展(可能是添加一些已經“免費”提供的功能在 log4net 和 NLog 等框架中?)。如果您使用 System.Diagnostics,我認為共識(正如我的建議)使用 TraceSource 對象而不是 Trace.WriteLine/Debug.WriteLine。

還要注意 System.Diagnostics 和 WCF 可以很好地協同工作。可以使用 System.Diagnostics 記錄 WCF 消息流量,並且 WCF 還將跨 WCF 服務邊界呼叫傳播 System.Diagnostics 活動資訊 (System.Diagnostics.CorrelationManager.ActivityId)。

我不太確定 log4net 是否應該繼續保持其最受青睞的狀態。 正如在 SO 的其他地方所指出的那樣,log4net 最近似乎沒有進行大量開發(請注意,我認為“log4net 已死”是誇大其詞),而 NLog 2.0 目前處於測試階段,最終版本預計在第一季度發布2011(更新:NLog 2.0於 2011年 7 月 17 日發布)。這是否使 NLog 成為比 log4net 更好的選擇?我不知道,但我認為,相對而言,在兩者之間進行選擇時,NLog 至少應該得到同等的考慮,並且可能應該是新開發的首選,至少在 log4net 開發顯示出更多生命跡象之前。

log4net 和 NLog 都提供了非常靈活的配置選項。它們允許您在日誌記錄語句的定義中具有非常精細的粒度(通過為每種類型定義記錄器的“標準”模式)。它們還允許您開發自己的“日誌記錄目標”對象(log4net Appender 和 NLog 目標)和“格式化”對象(log4net 模式轉換器和 NLog LayoutRenderers),從而輕鬆擴展庫。

除了日誌框架的選擇之外,一些(很多?)提倡通過使用抽象層將您的應用程式碼與對特定日誌框架的硬依賴隔離開來。這可以採用您自己實現的 ILogger 介面的形式,可能在現有框架之上。將來,您可以通過在不同的框架上實現 ILogger 來更改框架。或者,您可以使用 DI/IoC 將“ILogger”注入您的程式碼。許多 DI/IoC 框架提供了內置的 ILogger 抽象,可以配置為使用 log4net、NLog 或 Enterprise Library,或者您可以編寫自己的 ILogger 實現並註入)。誰在乎實現是什麼?另一種使您的程式碼免受對特定日誌框架的硬依賴的方法是使用現有的日誌抽象框架,例如 Common.Logging 或 SLF。好處是,您的應用程序不依賴於特定的日誌記錄框架。但是,有些人會說您剛剛將一個依賴項(在日誌框架上)換成了另一個(日誌抽象框架)。

關於日誌抽象的另外兩個注意事項:

  1. 一個好的日誌抽象應該允許您在同一個輸出文件中擷取來自不同日誌框架的輸出。Common.Logging 將此稱為“橋接”。假設您使用 NLog 支持的 Common.Logging 編寫了一個應用程序。現在假設您正在使用直接使用 log4net 編寫的第三方類庫。使用橋接系統,您可以擷取 log4net 輸出(通過自定義附加程序)並通過 Common.Logging 重新路由它,以便可以在應用程序日誌輸出的上下文中查看第三方類庫的日誌輸出。
  2. 使用日誌抽像還允許您在開發期間“測試驅動”日誌框架。你可能一開始認為 log4net 就是這樣,但你想讓自己敞開心扉去嘗試 NLog。使用日誌抽象可以相對容易地在兩者之間切換。最終,您可以選擇使用哪個日誌框架,但與此同時,您已經能夠編寫大量不依賴於特定日誌框架的程式碼。

您可能會選擇一個框架而不是另一個框架的另一個原因是您工作的環境。如果您已經在使用 Enterprise Library 的一部分,那麼這可能足以促使您使用 Enterprise Library 日誌記錄。

如果您在 Silverlight 中進行開發怎麼辦?您可能會選擇使用像Clog 之類的東西 - 鈣的一部分。您也可以選擇使用與 Silverlight 和 WP7 兼容的 NLog 2.0。

System.Diagnostics 外掛(Ukadc.Diagnostics、Essential.Diagnostics)。這些不是日誌框架本身。相反,它們表示可以與現有 System.Diagnostics 框架一起使用的有用對象和擴展點的集合。在我看來,這些外掛中的每一個添加的最好的事情之一就是能夠格式化您的日誌輸出,類似於使用 log4net 和 NLog 格式化它的方式。我沒有用過 Essential.Diagnostics,但是我用 Ukadc.Diagnostics 做了實驗,覺得它真的很酷。編寫自己的“格式化標記”甚至很容易。

我不知道這是否完全回答了您的問題(無論如何都相當廣泛),但我認為這裡有很多值得思考的地方。

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