1. 程式人生 > >Log4net學習系列(一)——Log4net的基礎知識學習

Log4net學習系列(一)——Log4net的基礎知識學習

  今天把Log4net日誌記錄做了封裝,作為一個公共的類庫。記錄一下應該注意的地方。先了解一下log4net的理論知識。

  參考百度百科

一、log4net是什麼?  

  log4net庫是Apache log4j框架在Microsoft .NET平臺的實現,是一個幫助程式設計師將日誌資訊輸出到各種目標(控制檯、檔案、資料庫等)的工具。  log4net是 Apache軟體基金會Apache Logging Services工程的一部分。Apache日誌服務工程致力於為程式除錯和審計提供跨語言的日誌服務。   二、log4net特徵
  • 支援多數框架
  • 可輸出日誌到多種目標
  • 層級日誌體系
  • 可使用XML配置
  • 可動態配置
  • 記錄上下文資訊
  • 被檢驗過的體系
  • 模組化和可擴充套件化設計
  • 靈活、高效能

三、Log4Net的結構

  Log4Net有四種主要的元件,分別是Logger(記錄器),Repository(庫),Appender(附著器),以及 Layout(佈局)

  1、Logger記錄器

    (1)Logger記錄器:Logger是應用程式需要互動的主要元件,它用來產生日誌訊息。產生的日誌訊息並不直接顯示,還要預先經過Layout的格式化處理後才會輸出。

  Logger提供了多種方式來記錄一個日誌訊息,你可以在你的應用程式裡建立多個Logger,每個例項化的Logger物件都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger物件,你不必將它在不同的類或物件間傳遞,只需要用它的名字為引數呼叫就可以了。log4net框架使用繼承體系,繼承體系類似於.NET中的名字空間。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那麼我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性。

Log4net框架定義了一個ILog介面,所有的logger類都必須實現這個介面。如果你想實現一個自定義的logger,你必須首先實現這個介面。Log4Net框架定義了一個叫做LogManager的類,用來管理所有的logger物件。它有一個GetLogger()靜態方法,用我們提供的名字引數來檢索已經存在的Logger物件。如果框架裡不存在該Logger物件,它也會為我們建立一個Logger物件。

    (2)日誌的級別:ERROR、DEBUG、WARN、INFO、FATAL

  2、Repository庫

    Repository主要用於負責日誌物件組織結構的維護。在log4net的以前版本中,框架僅支援分等級的組織結構(hierarchical organization)。這種等級結構本質上是庫的一個實現,並且定義在log4net.Repository.Hierarchy 名字空間中。要實現一個Repository,需要實現log4net.Repository.ILoggerRepository 介面。但是通常並不是直接實現該介面,而是以log4net.Repository.LoggerRepositorySkeleton為基類繼承。體系庫 (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類實現。如果你是個log4net框架的使用者,而非擴充套件者,那麼你幾乎不會在你的程式碼裡用到Repository的類。相反的,你需要用到LogManager類來自動管理庫和日誌物件。

  3、Log4Net Appender(附著器)

    一個好的日誌框架應該能夠產生多目的地的輸出。比如說輸出到控制檯或儲存到一個日誌檔案。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的元件來定義輸出介質。正如名字所示,這些元件把它們附加到Logger日誌元件上並將輸出傳遞到輸出流中。你可以把多個Appender元件附加到一個日誌物件上。 

    Appender和root經常搭配使用

    appender:決定日誌輸出的方式(可設定多個節點,如對INFO,ERROR等設定不同的輸出方式)。

    主要包括已下幾種:

    1 AnsiColorTerminalAppender:在ANSI 視窗終端寫下高亮度的日誌事件。
    2 AspNetTraceAppender:能用asp.net中Trace的方式檢視記錄的日誌。
    3 BufferingForwardingAppender:在輸出到子Appenders之前先快取日誌事件。
    4 ConsoleAppender:將日誌輸出到控制檯。
    5 EventLogAppender:將日誌寫到Windows Event Log. 
    6 FileAppender:將日誌寫到檔案中。
    7 LocalSyslogAppender:將日誌寫到local syslog service (僅用於UNIX環境下). 
    8 MemoryAppender:將日誌存到記憶體緩衝區。
    9 NetSendAppender:將日誌輸出到Windows Messenger service.這些日誌資訊將在使用者終端的對話方塊中顯示。
    10 RemoteSyslogAppender:通過UDP網路協議將日誌寫到Remote syslog service。
    11 RemotingAppender:通過.NET Remoting將日誌寫到遠端接收端。
    12 RollingFileAppender:將日誌以回滾檔案的形式寫到檔案中。(例項程式碼中使用的是此型別)
    13 SmtpAppender:將日誌寫到郵件中。
    14 TraceAppender:將日誌寫到.NET trace 系統。
    15 UdpAppender:將日誌connectionless UDP datagrams的形式送到遠端宿主或以UdpClient的形式廣播。

    從上面提供的方式中可以看出能輸出檔案、控制檯、Windows事件日誌和資料庫。這個可根據實際情況選擇。    

<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...
</appender>

    這裡配置的name(“Log4Net_INFO”)會在定義日誌的輸出媒介中使用到。name可任意設定。

    root的配置說明 。

    root:對設定輸出的方式進行指定。

<root>
    <!--批定DEBUG輸出的檔案形式記錄日誌-->
    <level value="DEBUG"/>
    <appender-ref ref="Log4Net_ERROR" />
  
  <!--批定INFO輸出的檔案形式記錄日誌-->
    <level value="INFO"/>
    <appender-ref ref="Log4Net_INFO" />
</root>

 

  4、Appender Filters過濾器
    一個Appender物件預設地將所有的日誌事件傳遞到輸出流。Appender的過濾器(Appender Filters) 可以按照不同的標準過濾日誌事件。在log4net.Filter的名字空間下已經有幾個預定義的過濾器。使用這些過濾器,你可以按照日誌級別範圍過濾日誌事件,或者按照某個特殊的字串進行過濾。  

    過濾器通常有以下幾種:

    • DenyAllFilter 阻止所有的日誌事件被記錄
    • LevelMatchFilter 只有指定等級的日誌事件才被記錄
    • LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄
    • LoggerMatchFilter 與Logger名稱匹配,才記錄
    • PropertyFilter 訊息匹配指定的屬性值時才被記錄
    • StringMathFilter 訊息匹配指定的字串才被記錄

  5、Layout佈局

    Layout 元件用於向用戶顯示最後經過格式化的輸出資訊。輸出資訊可以以多種格式顯示,主要依賴於我們採用的Layout元件型別。可以是線性的或一個XML檔案。Layout元件和一個Appender元件一起工作。API幫助手冊中有關於不同Layout元件的列表。一個Appender物件,只能對應一個Layout物件。要實現你自己的Layout類,你需要從log4net.Layout.LayoutSkeleton類繼承,它實現了ILayout介面。

  一個Appender只能有一個Layout。

  最常用的Layout應該是經典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然後還有IRawLayout,XMLLayout等幾個,使用較少。Layout可以自己實現,需要從log4net.Layout.LayoutSkeleton類繼承,來輸出一些特殊需要的格式,在後面擴充套件時就重新實現了一個Layout。

    • SimpleLayout簡單輸出格式,只輸出日誌級別與訊息內容。
    • RawTimeStampLayout 用來格式化時間,在向資料庫輸出時會用到。樣式如“yyyy-MM-dd HH:mm:ss“
    • ExceptionLayout需要給Logger的方法傳入Exception物件作為引數才起作用,否則就什麼也不輸出。輸出的時候會包含Message和Trace。
    • PatterLayout使用最多的一個Layout,能輸出的資訊很多

 

四、簡單的Log4Net.config配置及說明            

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!--新增自定義節點:log4net  type:解析類名,程式集名(log4net.dll)-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!--定義輸出到檔案中-->
    <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
      <!--定義檔案存放位置-->
      <file value="C:/log4net/"/>
      <!--是否追加到檔案,預設為true,通常無需設定-->
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <!--日期的格式,每天換一個檔案記錄,如不設定則永遠只記錄一天的日誌,需設定-->
      <DatePattern value="INFO_yyyyMMdd&quot;.log&quot;" />
      <!--日誌檔名是否為靜態-->
      <StaticLogFileName value="false"/>
      <!--多執行緒時採用最小鎖定-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <!--佈局(向用戶顯示最後經過格式化的輸出資訊)-->
      <layout type="log4net.Layout.PatternLayout">
        <!--
           %m(message):輸出的日誌訊息,如ILog.Debug(…)輸出的一條訊息 
           %n(new line):換行 
           %d(datetime):輸出當前語句執行的時刻 
           %r(run time):輸出程式從執行到執行到當前語句時消耗的毫秒數 
           %t(thread id):當前語句所在的執行緒ID 
           %p(priority): 日誌的當前優先級別,即DEBUG、INFO、WARN…等 
           %c(class):當前日誌物件的名稱,例如:
           %L:輸出語句所在的行號 
           %F:輸出語句所在的檔名 
           %-數字:表示該項的最小長度,如果不夠,則用空格填充
          -->
        <Header value="[Header]&#13;&#10;"/>
        <Footer value="[Footer]&#13;&#10;"/>
        <!--正文-->
        <ConversionPattern value="記錄時間:%date 執行緒ID:[%thread] 日誌級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline"  />
      </layout>
    </appender>

    <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
      <file value="C:/log4net/"/>
      <appendToFile value="true"/>
      <RollingStyle value="Date"/>
      <DatePattern value="ERROR_yyyyMMdd&quot;.log&quot;" />
      <StaticLogFileName value="false"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Header]&#13;&#10;"/>
        <Footer value="[Footer]&#13;&#10;"/>
        <!--正文-->
        <ConversionPattern value="記錄時間:%date 執行緒ID:[%thread] 日誌級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline"  />
      </layout>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="Log4Net_ERROR" />

      <level value="INFO"/>
      <appender-ref ref="Log4Net_INFO" />
    </root>

  </log4net>

</configuration>