log4net 與 TraceSource [關閉]
在這個執行緒中,許多人表示他們使用 log4net。我是 TraceSources 的粉絲,想知道為什麼要使用 log4net。
這就是我喜歡跟踪源的原因:
- 可插入的偵聽器 - XML、TextFile、Console、EventLog,您自己的
- 可定制的跟踪開關(錯誤、警告、資訊、詳細、開始、結束、自定義)
- 可定制的配置
- 日誌記錄應用程序塊只是一大組 TraceListeners
- 活動/範圍的相關性(例如,將 ASP.NET 請求中的所有日誌與給定客戶相關聯
- 服務跟踪查看器允許您分別針對這些活動視覺化事件
- 所有這些都可以在 app.config/web.config 中進行配置。
由於 .NET 框架內部使用 TraceSources,它還為我提供了一種配置跟踪的一致方式 - 使用 log4net,我必須配置 log4net 以及 TraceSources。
log4net 給了我什麼 TraceSources 沒有(或者無法通過編寫幾個自定義 TraceListeners 來完成)?
我認為 log4net 正在做你為我列出的所有事情。
可插拔監聽器聽起來像附加器——它們有很多,事實上我什至破解了滾動日誌文件以始終以 .log 結尾(用於文件關聯),在電子郵件附加器中添加了一個 cc 欄位,最後調整了我最喜歡的值彩色控制台附加程序。如果我可以這麼大膽——我的彩色控制台幸福:
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <!-- Can Use: Blue Green Red White Yellow Purple Cyan HighIntensity --> <mapping> <level value="FATAL" /> <foreColor value="Yellow, HighIntensity" /> <backColor value="Red" /> </mapping> <mapping> <level value="ERROR" /> <foreColor value="White" /> <backColor value="Purple, HighIntensity" /> </mapping> <mapping> <level value="WARN" /> <backColor value="Blue" /> <foreColor value="White" /> </mapping> <mapping> <level value="INFO" /> <backColor value="Green" /> <foreColor value="White" /> </mapping> <mapping> <level value="DEBUG" /> <foreColor value="White" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--> <!--<conversionPattern value="%-5level %file:%line - %message%newline" />--> <conversionPattern value="%level %logger:%line %newline %message%newline" /> </layout>可定制的跟踪開關:Log4net 僅附帶 FATAL ERROR WARN INFO DEBUG 以增加詳細程度。我真正想念的唯一一個是 AUDIT for who-did-what 日誌記錄。
可定制的配置:我使用在執行時載入的 log4net.config 文件(或將日誌寫入 c:\ 抱怨我找不到配置。)
Try ' Get log4net configuration from file Dim logConfigFile As FileInfo logConfigFile = New FileInfo(".\log4net.config") If logConfigFile.Exists Then XmlConfigurator.Configure(logConfigFile) Else CreateEmergenceLogFile(logConfigFile.FullName) End If Catch ex As Exception Console.Out.WriteLine("Could not load the log4net config file") End Try只是一大組 TraceListeners:抱歉跳過那個 - 我會相信你的話。
活動/範圍的相關性:您的意思是每個文件(讀取類)都有自己的命名日誌,可以有單獨的日誌級別門檻值。實際上,您甚至可以在單個類中對日誌記錄進行分段(實際上,這可能已經做得太多了……)
在類文件中:
Private Shared _logger As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) Private Shared _loggerAttribute As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute") Private Shared _loggerCache As log4net.ILog = _ log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache")服務跟踪查看器:在 log4net.config 中:
<logger name="NipissingU.ADWrapper.EntryTools.Attribute"> <level value="INFO" /> </logger> <logger name="NipissingU.ADWrapper.EntryTools.Cache"> <level value="WARN" /> </logger>所有這些都可以在 app.config/web.config 中進行配置:也許這在 ASP.NET 中是件好事,我不知道,但是在製作富客戶端 bean 計數應用程序時,我喜歡單獨的配置文件。
這裡的一切都只是我自己的小使用技巧。
hth,-邁克
在早期(.NET 1.0)中,.NET Framework 中的跟踪非常有限。
例如,直到 .NET 2.0 才出現 TraceSource 分區,並且您只有四個級別(錯誤、警告、資訊、詳細),儘管如果您願意,可以使用六個布爾開關進行分區。
log4j 在 Java 中很流行,因此對 .NET 埠有很多支持,一旦它流行起來,它就一直保持這種狀態,即使人們甚至沒有正確使用它(例如,將它包裝在單例記錄器中並失去它的主要特點)。
儘管如此,我仍然認為 log4net 和其他框架(例如 NLog、Common.Logging 甚至 EntLib)通過從頭開始實現自己的日誌系統而走錯了路,即甚至改變了您編寫日誌語句的方式。
我更希望看到努力,特別是從 .NET 2.0 開始,用於擴展 .NET 中已有內容的堅實基礎。對於確實擴展已有內容的項目,請查看 CodePlex ( <http://essentialdiagnostics.codeplex.com/> ) 上的 Essential Diagnostics 項目。
log4net 的一些優勢:
- 如果您執行混合環境並想要一致的日誌記錄,它類似於 log4j。
- 與您實現和必須配置的跟踪源數量相比,繼承設置的自動記錄器層次結構非常簡潔。(儘管在某些情況下可能矯枉過正)。
- log4net 已經有大約 28 個附加程序(相當於跟踪偵聽器),而 System.Diagnostics 只有 10 個(但請參閱 Essential.Diagnostics 項目了解更多資訊),所以如果你真的認為你可能需要 RemoteSyslogAppender、NetSendAppender、AnsiColorTerminalAppender 或 TelnetAppender,那麼你很幸運。
缺點(與 System.Diagnostics 相比):
- 您需要使用不同的日誌記錄語法,因此如果您已經在使用 source.TraceEvent(),則需要檢查並替換所有內容。
- 這也擴展到不同的關聯語法,因此您需要從 CorrelationManager 更改為 log4net 上下文。
- 不容易與框架跟踪(例如 WCF)集成。
- 對事件 ID 的支持不佳(需要使用單獨的擴展項目 IEventLog)。
- 尚不支持 Windows (Vista) 的事件跟踪或服務跟踪查看器 XML 格式。