Log4Net使用

Log4Net配置

首先引用log4net.dll或者經過Nuget安裝log4net。
程序啓動時須要讀取log4net的配置文件。
能夠直接配置到app.config文件中,也能夠另新建一個文件來存儲log4net配置信息。
若是是直接配置到App.config中時,直接調用log4net.Config.XmlConfigurator.Configure();
若是是另新建一個文件:log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
這裏放上我再一個應用中的配置,採用的是另外新建文件。數據庫

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
  </configSections>

  <log4net >
    <!--配置日誌的級別,低於此級別的就不寫到日誌裏面去
       OFF、FATAL、ERROR, WARN, INFO, DEBUG, ALL
       -->
    <root>
      <level value="DEBUG" />
      <appender-ref ref="DebugAppender" />
      <appender-ref ref="InfoAppender" />
      <appender-ref ref="ErrorAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>

    <logger name="WebLogger">
      <level value="ERROR" />
    </logger>

    <!--輸出控制檯-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender,log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line) %m%n" />
      </layout>
    </appender>

    <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log/DEBUG/" />
      <param name="AppendToFile" value="true" />
      <param name="MaximumFileSize" value="10MB"/>
      <param name="MaxSizeRollBackups" value="31" />
      <param name="RollingStyle" value="Composite" />
      <param name="DatePattern" value="&quot;Log_&quot;yyyyMMdd&quot;----Debug.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="Header" value="&#xD;&#xA;----------------------application startup V1.00--------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line)  %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug" />
        <param name="LevelMax" value="Debug" />
      </filter>
    </appender>

    <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log/Info/" />
      <param name="AppendToFile" value="true" />
      <param name="MaximumFileSize" value="10MB"/>
      <param name="MaxSizeRollBackups" value="31" />
      <param name="RollingStyle" value="Composite" />
      <param name="DatePattern" value="&quot;Log_&quot;yyyyMMdd&quot;----Info.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="Header" value="&#xD;&#xA;----------------------application startup V1.00--------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line)  %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>

    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log/Error/" />
      <param name="AppendToFile" value="true" />
      <param name="MaximumFileSize" value="10MB"/>
      <param name="MaxSizeRollBackups" value="31" />
      <param name="RollingStyle" value="Composite" />
      <param name="DatePattern" value="&quot;Log_&quot;yyyyMMdd&quot;----Error.txt&quot;" />
      <param name="StaticLogFileName" value="false" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="Header" value="&#xD;&#xA;----------------------application startup V1.00--------------------------&#xD;&#xA;" />
        <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c - (%line)  %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="OFF" />
      </filter>
    </appender>

  </log4net>
</configuration>

在程序中使用:c#

log4net.ILog log = log4net.LogManager.GetLogger("test");
log.Info("同一個世界");

Log4Net的主要組成部分

Appenders

Appenders用來定義日誌的輸出方式,即日誌要寫到哪一種介質上去。較經常使用的Log4Net已經實現好了,直接在配置文件中調用就能夠了;固然也能夠本身寫一個,須要從log4net.Appender.AppenderSkeleton類繼承。它還能夠經過配置Filters和Layout來實現日誌的過濾和輸出格式。
已經實現的輸出方式有:
AdoNetAppender將日誌記錄到數據庫中。能夠採用SQL和存儲過程兩種方式。
AnsiColorTerminalAppender將日誌高亮輸出到ANSI終端。
AspNetTraceAppender能用Asp.net中Trace的方式查看記錄的日誌。
BufferingForwardingAppender在輸出到子Appenders以前先緩存日誌事件。
ConsoleAppender將日誌輸出到應用程序控制臺。
EventLogAppender將日誌寫到Windows Event Log.
FileAppender將日誌輸出到文件。
ForwardingAppender發送日誌事件到子Appenders。
LocalSyslogAppender將日誌寫到local syslog service(僅用於Unix環境下)
MemoryAppender將日誌存到內存緩衝區。
NetSendAppender將日誌輸出到Window Messager service。這些日誌信息將在用戶終端的對話框中顯示。
OutputDebugStringAppender將日誌輸出到Debuger,若是程序沒有Debuger,就輸出到系統Debuger。若是系統Debuger也不可用,將忽略消息。
RemoteSyslogAppender經過UDP網絡協議將日誌寫到Remote syslog service。
RemotingAPpender經過.net Remoting將日誌寫到遠程接收端。
RollingFileAppender將日誌以回滾文件的形式寫到文件中。
SmtpAppender將日誌寫到郵件中。
SmtpPickupDirAppender將消息以文件的方式放入一個目錄中。
TelnetAppender客戶端經過Telnet來接收日誌事件。
TraceAppender將日誌寫到.net trace系統。
UdpAppender將日誌以無鏈接UDP數據報的形式發送到遠程。緩存

Filters

使用過濾器能夠過濾掉Appender輸出的內容。過濾器一般有如下幾種:
DenyAllFilter阻止全部的日誌事件被記錄。
LevelMatchFilter只有指定等級的日誌事件才被記錄。
LevelRangeFilter日誌等級在指定範圍內的事件才被記錄。
LoggerMatchFilter與Logger名稱匹配,才記錄。
PropertyFilter消息匹配指定的屬性值才被記錄。
StringMatchFilter消息匹配指定的字符串才被記錄。安全

Layouts

Layout用於控制Appender的輸出格式,能夠是線性的也能夠是XML.
一個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,能輸出的信息不少,使用方式可參見上面例子中的配置文件。網絡

Loggers

Logger是直接和應用程序交互的組件。Logger只是產生日誌,而後由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。
Logger提供了多種方式來記錄一個日誌消息,也能夠有多個Logger同時存在。每一個實例化的Logger對象對被log4net做爲命名實體來維護。log4net使用繼承體系,也就是說加入存在兩個Logger,名字分別爲a.b.c和a.b。那麼a.b就是a.b.c的祖先。每一個Logger都繼承了它祖先的屬性。全部的Logger都從Root繼承,Root自己也是一個Logger.
日誌的等級,它們由高到低分別爲:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
高於等級設定值方法都能寫入日誌,Off全部寫入方法都不能寫到日誌裏,ALL則相反。
在具體寫日誌時,通常能夠這樣理解日誌等級:
FATAL(致命錯誤):記錄系統中出現的能使系統徹底失去功能,服務中止,系統崩潰等使系統沒法繼續運行下去的錯誤。例如,數據庫沒法鏈接,系統出現死循環。
ERROR(通常錯誤):記錄系統中出現的致使系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,數據字段爲空,數據操做不可完成,操做出現異常等。
WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引發系統錯誤的信息。例如,記錄內容爲空,數據內容不正確等。
INFO(通常信息):記錄系統運行中應該讓用戶知道的基本信息。例如,服務開始運行,功能已經開戶等。
DEBUG(調試信息):記錄系統用於調試的一切信息,內容或者是一些關鍵內容的輸出。
Logger實現的ILog接口,ILog定義了5個方法(Debug,Info,Warn,Error,Fatal)分別對不一樣的日誌等級記錄日誌。這5個方法還有5個重載。多線程

Object Renders

它將告訴logger如何把一個對象轉化爲一個字符串記錄到日誌裏。(ILog中定義的接口接收的參數是Object,而不是String)
例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange默認的ToString方法而已。因此要定義一個OrangeRender類實現Log4net.ObjectRender.IObjectRender接口,而後註冊它。app

Repository

Repository主要用於日誌對象組織結構的維護。框架

配置文件詳解

配置文件構成

主要有兩大部分,一是申明一個名爲log4net的自定義配置節,以下所示:佈局

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
  </configSections>

二是log4net節的具體配置。
全部的配置都要在log4net元素裏定義。
支持的屬性:
|||
|---|---|---|
|debug|可選,默認爲False,設置爲True,開啓log4net的內部調試|
|update|可選,取值是Merge(合併)或Overwrite(覆蓋),默認值是Merge.設置爲OverWrite,在提交配置的時候會重置已經配置過的庫.|
|threshold|可選,取值是repository中註冊的level,默認值是All|編碼

支持的子元素:
|||
|---|---|
|appender|0或多個|
|logger|0或多個|
|renderer|0或多個|
|root|最多一個|
|param|0或多個|

root

實際上就是一個根logger,全部其它logger都默認繼承它,若是配置文件裏沒有顯示定義,則框架使用根日誌中定義的屬性。root元素沒有屬性。
支持的子元素:
|||
|--|--|
|appender-ref|0個或多個,要引用的appender的名字|
|level|最多一個,只有在這個級別或之上的事件纔會被記錄|
|param|0個或多個,設置一些參數|

logger

支持的屬性:
|||
|---|---|
|name|必須的,logger的名稱|
|additivity|可選,默認值爲True,設置爲False時將阻止父logger中的appender|
支持的子元素:
|||
|--|--|
|appender-ref|0個或多個,要引用的appender的名字|
|level|最多一個,只有在這個級別之上的事件纔會被記錄|
|param|0個或多個,設置一些參數|

appender

定義日誌的輸出方式,只能做爲log4net的子元素。name屬性必須惟一,type屬性必須指定。
支持的屬性:
|||
|--|--|
|name|必須的,appender對象的名稱|
|type|必須的,appender對象的輸出類型|

支持的子元素:
|||
|--|--|
|appender-ref|0個或多個,容許appender引用其餘appender,並非全部appender類型都支持|
|filter|0個或多個,定義此app使用的過濾器|
|layout|最多一個,定義appender使用的輸出格式|
|param|0個或多個,設置Appender類中對應的屬性的值|
實際上appender所能包含的子元素遠不止上面4個。

layout

佈局,只能做爲appender的子元素。
支持的屬性:
|||
|---|---|
|type|必須的,Layout的類型|
支持的子元素:
|||
|---|---|
|param|0個或多個,設置一些參數|

filter

過濾器,只能做爲appender的子元素
支持的屬性:
|||
|---|---|
|type|必須的,Filter的類型|
支持的子元素:
|||
|---|---|
|param|0個或多個,設置一些參數|

param

param元素能夠是任何的子元素。
支持的屬性:
|||
|---|---|
|name|必須的,取值是父對象的參數名|
|value|可選的,value和type中,必須有一個屬性值被指定。value是一個能被轉爲參數值的字符串|
|type|可選的,type是一個類型名,若是type不是在log4net程序集中定義的,就須要使用全名|

支持的子元素:
|||
|---|---|
|param|0個或多個,設置一些參數|

appender配置

appender在配置文件中至少有一個,也能夠有多個,有些appender類型還能夠引用其餘appender類型。

寫入回滾文件

<appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">

<!--日誌文件路徑,「/」與「/」做用相同,到達的目錄相同,文件夾不存在則新建 -->

<!--按文件大小方式輸出時在這裏指定文件名,而且當天的日誌在下一天時在文件名後自動追加當天日期造成新文件。-->

<!—按照日期形式輸出時,直接鏈接元素DatePattern的value造成文件路徑。此處使用這種方式 -->

<!--param的名稱,能夠直接查對應的appender類的屬性名便可,這裏要查的就是RollingFileAppender類的屬性 -->

      <param name="File" value="D:/Log/" />

 

      <!--是否追加到文件-->

      <param name="AppendToFile" value="true" />

 

      <!--記錄日誌寫入文件時,不鎖定文本文件,防止多線程時不能寫Log,官方說線程非安全-->

      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

 

      <!—使用Unicode編碼-->

      <Encoding value="UTF-8" />

 

      <!--最多產生的日誌文件數,超過則只保留最新的n個。設定值value="-1"爲不限文件數-->

      <param name="MaxSizeRollBackups" value="10" />

 

      <!--是否只寫到一個文件中-->

      <param name="StaticLogFileName" value="false" />

 

      <!--按照何種方式產生多個日誌文件(日期[Date],文件大小[Size],混合[Composite])-->

      <param name="RollingStyle" value="Composite" />

 

      <!--按日期產生文件夾和文件名[在日期方式與混合方式下使用]-->

<!—此處按日期產生文件夾,文件名固定。注意&quot; 的位置-->

      <param name="DatePattern" value="yyyy-MM-dd/&quot;ReflectionLayout.log&quot;"  />

<!—這是按日期產生文件夾,並在文件名前也加上日期-->

      <param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-TimerServer.log&quot;"  />

<!—這是先按日期產生文件夾,再造成下一級固定的文件夾—>

      <param name="DatePattern" value="yyyyMMdd/&quot;TimerServer/TimerServer.log&quot;"  />

 

      <!--每一個文件的大小。只在混合方式與文件大小方式下使用。

超出大小後在全部文件名後自動增長正整數從新命名,數字最大的最先寫入。

可用的單位:KB|MB|GB。不要使用小數,不然會一直寫入當前日誌-->

      <param name="maximumFileSize" value="500KB" />

 

<!--計數類型爲1,2,3…-->
      <param name="CountDirection" value="1"/>

 

<!—過濾設置,LevelRangeFilter爲使用的過濾器。 -->

      <filter type="log4net.Filter.LevelRangeFilter">

        <param name="LevelMin" value="DEBUG" />

        <param name="LevelMax" value="WARN" />

      </filter>

 

      <!--記錄的格式。通常用log4net.Layout.PatternLayout佈局-->

<!—此處用繼承了log4net.Layout.PatternLayout的自定義佈局,TGLog.ExpandLayout2

爲命名空間。%property{Operator}、%property{Action}是自定義的輸出-->

      <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

        <param name="ConversionPattern"

 value="記錄時間:%date 線程ID:[%thread] 日誌級別:%-5level 記錄類:%logger     操做者ID:%property{Operator} 操做類型:%property{Action}%n             當前機器名:%property%n當前機器名及登陸用戶:%username %n               記錄位置:%location%n 消息描述:%property{Message}%n                    異常:%exception%n 消息:%message%newline%n%n" />

      </layout>

</appender>

注意這些配置屬性有些是可選的,若是須要,必定要寫正確,不然要麼輸出的不是本身想要的結果,要麼乾脆不輸出任何信息。
相關文章
相關標籤/搜索