Dot-Net

log4net 與 TraceSource [關閉]

  • February 23, 2009

這個執行緒中,許多人表示他們使用 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 格式。

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