見到的最好的log4net說明:[網摘]Log4net創建日誌及簡單擴展

1、概述

log4net.Net下一個非常優秀的開源日誌記錄組件。log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,以不同的格式,輸出到不同的媒介。本文主要是介紹如何在Visual Studio2008中使用log4net快速創建系統日誌,如何擴展以輸出自定義字段。

2、一個簡單的使用實例

第一步:在項目中添加對log4net.dll的引用,這裏引用版本是1.2.10.0

第二步:程序啓動時讀取log4net的配置文件。

如果是CS程序,在根目錄的Program.cs中的Main方法中添加:

log4net.Config.XmlConfigurator.Configure();

如果是BS程序,在根目錄的Global.asax.cs(沒有新建一個)中的Application_Start方法中添加:

log4net.Config.XmlConfigurator.Configure();

無論BS還是CS程序都可直接在項目的AssemblyInfo.cs文件裏添加以下的語句:

[assembly: log4net.Config .XmlConfigurator()]

也可以使用自定義的配置文件,具體請參見4.4 關聯配置文件。

第三步:修改配置文件。如果是CS程序,則在默認的App.config文件(沒有新建一個)中添加內容;如果是BS程序,則添加到Web.config文件中,添加內容一樣,這裏不再列出。

App.config文件添加內容如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

<section name="log4net"

type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

  </configSections>

 

  <log4net>

    <root>

      <level value="WARN" />

      <appender-ref ref="LogFileAppender" />

      <appender-ref ref="ConsoleAppender" />

    </root>

 

    <logger name="testApp.Logging">

      <level value="DEBUG"/>

    </logger>

 

    <appender name="LogFileAppendertype="log4net.Appender.FileAppender" >

      <param name="File" value="log-file.txt" />

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

 

      <layout type="log4net.Layout.PatternLayout">

        <param name="Header" value="[Header] "/>

        <param name="Footer" value="[Footer] "/>

        <param name="ConversionPatternvalue="%d [%t] %-5p %c [%x]  - %m%n" />

      </layout>

 

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

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

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

      </filter>

    </appender>

 

    <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >

      <layout type="log4net.Layout.PatternLayout">

        <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n" />

      </layout>

    </appender>

 

  </log4net>

</configuration>

第四步:在程序使用。

log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");//獲取一個日誌記錄器

log.Info(DateTime.Now.ToString() + ": login success");//寫入一條新log

這樣就將信息同時輸出到控制檯和寫入到文件名爲“log-file.txt”的文件中,其中“log-file.txt”文件的路徑是當前程序運行所在目錄;也可以定義爲絕對路徑,配置如:

<param name="File" value="C:\log-file.txt" />就寫入C盤根目錄下log-file.txt文件中,具體使用技巧參見4.2.1

 

本例的實現請參見8.6附件。

3Log4net的主要組成部分

3.1 Appenders

Appenders用來定義日誌的輸出方式,即日誌要寫到那種介質上去。較常用的Log4net已經實現好了,直接在配置文件中調用即可,可參見上面配置文件例子;當然也可以自己寫一個,需要從log4net.Appender.AppenderSkeleton類繼承。它還可以通過配置FiltersLayout來實現日誌的過濾和輸出格式。

已經實現的輸出方式有:

AdoNetAppender 將日誌記錄到數據庫中。可以採用SQL和存儲過程兩種方式。

AnsiColorTerminalAppende將日誌高亮輸出到ANSI終端。

AspNetTraceAppender  能用asp.netTrace的方式查看記錄的日誌。

BufferingForwardingAppender 在輸出到子Appenders之前先緩存日誌事件。

ConsoleAppender 將日誌輸出到應用程序控制臺。

EventLogAppender 將日誌寫到Windows Event Log

FileAppende將日誌輸出到文件。

ForwardingAppender 發送日誌事件到子Appenders

LocalSyslogAppender 將日誌寫到local syslog service (僅用於UNIX環境下)

MemoryAppender 將日誌存到內存緩衝區。

NetSendAppender 將日誌輸出到Windows Messenger service.這些日誌信息將在用戶終端的對話框中顯示。

OutputDebugStringAppender 將日誌輸出到Debuger,如果程序沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略消息。

RemoteSyslogAppender 通過UDP網絡協議將日誌寫到Remote syslog service

RemotingAppender 通過.NET Remoting將日誌寫到遠程接收端。

RollingFileAppender 將日誌以回滾文件的形式寫到文件中。

SmtpAppender 將日誌寫到郵件中。

SmtpPickupDirAppender 將消息以文件的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。

TelnetAppender 客戶端通過Telnet來接受日誌事件。

TraceAppender 將日誌寫到.NET trace 系統。

UdpAppender 將日誌以無連接UDP數據報的形式送到遠程宿主或用UdpClient的形式廣播。

3.2 Filters

使用過濾器可以過濾掉Appender輸出的內容。過濾器通常有以下幾種:

DenyAllFilter 阻止所有的日誌事件被記錄

LevelMatchFilter 只有指定等級的日誌事件才被記錄

LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄

LoggerMatchFilter Logger名稱匹配,才記錄

PropertyFilter 消息匹配指定的屬性值時才被記錄

StringMathFilter 消息匹配指定的字符串才被記錄

3.3 Layouts

Layout用於控制Appender的輸出格式,可以是線性的也可以是XML

一個Appender只能有一個Layout

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

SimpleLayout簡單輸出格式,只輸出日誌級別與消息內容。

RawTimeStampLayout 用來格式化時間,在向數據庫輸出時會用到。

樣式如“yyyy-MM-dd HH:mm:ss

ExceptionLayout需要給Logger的方法傳入Exception對象作爲參數才起作用,否則就什麼也不輸出。輸出的時候會包含MessageTrace

PatterLayout使用最多的一個Layout,能輸出的信息很多,使用方式可參見上面例子中的配置文件。PatterLayout的格式化字符串見文後附註8.1

3.4 Loggers

Logger是直接和應用程序交互的組件。Logger只是產生日誌,然後由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。

Logger提供了多種方式來記錄一個日誌消息,也可以有多個Logger同時存在。每個實例化的Logger對象對被log4net作爲命名實體(Named Entity)來維護。log4net使用繼承體系,也就是說假如存在兩個Logger,名字分別爲a.b.ca.b。那麼a.b就是a.b.c的祖先。每個Logger都繼承了它祖先的屬性。所有的Logger都從Root繼承Root本身也是一個Logger

日誌的等級,它們由高到底分別爲:

OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 

高於等級設定值方法(如何設置參見“配置文件詳解”)都能寫入日誌, Off所有的寫入方法都不寫到日誌裏,ALL則相反。例如當我們設成Info時,logger.Debug就會被忽略而不寫入文件,但是FATAL,ERROR,WARN,INFO會被寫入,因爲他們等級高於INFO

在具體寫日誌時,一般可以這樣理解日誌等級:

FATAL(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運行下去的錯誤。例如,數據庫無法連接,系統出現死循環。

ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,數據字段爲空,數據操作不可完成,操作出現異常等。

WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引起系統錯誤的信息。例如,記錄內容爲空,數據內容不正確等。

INFO(一般信息):記錄系統運行中應該讓用戶知道的基本信息。例如,服務開始運行,功能已經開戶等。

DEBUG (調試信息):記錄系統用於調試的一切信息,內容或者是一些關鍵數據內容的輸出。

Logger實現的ILog接口,ILog定義了5個方法(Debug,Inof,Warn,Error,Fatal)分別對不同的日誌等級記錄日誌。這5個方法還有5個重載。以Debug爲例說明一下,其它的和它差不多。

ILog中對Debug方法的定義如下:

void Debug(object message);

void Debug(object message, Exception ex);

還有一個布爾屬性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception ex),則無論Layout中是否定義了%exception,默認配置下日誌都會輸出Exception。包括ExceptionMessageTrace。如果使用Debug(object message),則日誌是不會輸出Exception

最後還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態方法,可以獲得配置文件中相應的Logger

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

3.5 Object Renders

它將告訴logger如何把一個對象轉化爲一個字符串記錄到日誌裏。(ILog中定義的接口接收的參數是Object,而不是String。)

例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange默認的ToString方法而已。所以要定義一個OrangeRender類實現log4net.ObjectRender.IObjectRender接口,然後註冊它(我們在本文中的擴展不使用這種方法,而是直接實現一個自定義的Layout)。這時logger就會知道如何把Orange記錄到日誌中了。

3.6 Repository

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

4、配置文件詳解

4.1 配置文件構成

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

  <configSections>

<section name="log4net"

type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

  </configSections>

二是<log4net>節的具體配置,這是下面要重點說明的。

4.1.1<log4net>

所有的配置都要在<log4net>元素裏定義。

支持的屬性:

debug

可選,取值是truefalse,默認是false。設置爲true,開啓log4net的內部調試。

update

可選,取值是Merge(合併)Overwrite(覆蓋),默認值是Merge。設置爲Overwrite,在提交配置的時候會重置已經配置過的庫。

threshold

可選,取值是repository(庫)中註冊的level,默認值是ALL

支持的子元素:

appender

0或多個

logger

0或多個

renderer

0或多個

root

最多一個

param

0或多個

 

4.1.2 <root>

實際上就是一個根logger,所有其它logger都默認繼承它,如果配置文件裏沒有顯式定義,則框架使用根日誌中定義的屬性root元素沒有屬性。

支持的子元素:

appender-ref

0個或多個,要引用的appender的名字。

level

最多一個。 只有在這個級別或之上的事件纔會被記錄。

param

0個或多個, 設置一些參數。

 

4.1.3 <logger>

支持的屬性:

name

必須的,logger的名稱

additivity

可選,取值是truefalse,默認值是true。設置爲false時將阻止父logger中的appender

支持的子元素:

appender-ref

0個或多個,要引用的appender的名字。

level

最多一個。 只有在這個級別或之上的事件纔會被記錄。

param

0個或多個, 設置一些參數。

 

4.1.4 <appender>

定義日誌的輸出方式,只能作爲 log4net 的子元素。name屬性必須唯一,type屬性必須指定。

支持的屬性:

name

必須的,Appender對象的名稱

type

必須的,Appender對象的輸出類型

支持的子元素:

appender-ref

0個或多個,允許此appender引用其他appender,並不是所以appender類型都支持。

filter

0個或多個,定義此app使用的過濾器。

layout

最多一個。定義appender使用的輸出格式。

param

0個或多個, 設置Appender類中對應的屬性的值。

實際上<appender>所能包含的子元素遠不止上面4個。

 

4.1.5 <layout>

佈局,只能作爲<appender>的子元素。

支持的屬性:

type

必須的,Layout的類型

支持的子元素:

param

0個或多個, 設置一些參數。

 

4.1.6 <filter>

過濾器,只能作爲<appender>的子元素。

支持的屬性:

type

必須的,Filter的類型

支持的子元素:

param

0個或多個, 設置一些參數。

 

4.1.7 <param>

<param>元素可以是何元素的子元素。

支持的屬性:

name

必須的,取值是父對象的參數名。

value

可選的,valuetype中,必須有一個屬性被指定。value是一個能被轉化爲參數值的字符串。

type

可選的,valuetype中,必須有一個屬性被指定。type是一個類型名,如果type不是在log4net程序集中定義的,就需要使用全名。

支持的子元素:

param

0個或多個, 設置一些參數。

 

4.2 <appender>配置

   <appender>在配置文件中至少有一個,也可以有多個,有些<appender>類型還可以引用其他<appender>類型,具體參數可參見上表。

下面只對寫入回滾文件與輸出到數據庫(這裏使用SQL數據庫)配置體會說一下,其他配置可參考官方網站:http://logging.apache.org/log4net/release/config-examples.html

4.2.1寫入回滾文件

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

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

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

<!按照日期形式輸出時,直接連接元素DatePatternvalue形成文件路徑。此處使用這種方式 -->

<!--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" />

 

<!--計數類型爲123-->
      
<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>

注意這些配置屬性有些是可選的,如果需要,一定要寫正確,否則要麼輸出的不是自己想要的結果,要麼乾脆不輸出任何信息。

4.2.1寫入SQL數據庫

需要在相應的數據庫中準備好一張表,創建語句如下:

CREATE TABLE [Log] (

[ID] [int] IDENTITY (1, 1) NOT NULL ,

[Date] [datetime] NOT NULL ,

[Thread] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Level] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Logger] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,

[Operator] [int] NULL ,

[Message] [text] COLLATE Chinese_PRC_CI_AS NULL ,

[ActionType] [int] NULL ,

[Operand] [varchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,

[IP] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,

[MachineName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Browser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[Location] [text] COLLATE Chinese_PRC_CI_AS NULL ,

[Exception] [text] COLLATE Chinese_PRC_CI_AS NULL

)

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">

<!--BufferSize爲緩衝區大小,只有日誌記錄超設定值纔會一塊寫入到數據庫-->

<bufferSize value="10" /><!或寫爲<param name="BufferSize" value="10" />-->

 

<!--引用-->

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

 

<!--連接數據庫字符串-->

<connectionString value="data source=.;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=;" />

 

<!--插入到表Log-->

<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@operator, @message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)" />

 

<!日誌記錄時間,RawTimeStampLayout爲默認的時間輸出格式 -->

      <parameter>

        <parameterName value="@log_date" />

        <dbType value="DateTime" />

        <layout type="log4net.Layout.RawTimeStampLayout" />

      </parameter>

 

      <!--線程號-->

      <parameter>

        <parameterName value="@thread" />

        <dbType value="String" />

<!長度不可以省略,否則不會輸出-->

        <size value="100" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%thread" />

        </layout>

      </parameter>

 

      <!--日誌等級-->

      <parameter>

        <parameterName value="@log_level" />

        <dbType value="String" />

        <size value="100" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%level" />

        </layout>

      </parameter>

 

      <!--日誌記錄類名稱-->

      <parameter>

        <parameterName value="@logger" />

        <dbType value="String" />

        <size value="200" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%logger" />

        </layout>

      </parameter>

     

      <!--操作者。這個是自定義的輸出字段,使用重新實現的佈局器ReflectionLayout -->

      <parameter>

        <parameterName value="@operator" />

<!設置爲Int32時只有bufferSize value<="1"才正確輸出,沒有找出原因-->

        <dbType value="Int16" />

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

          <conversionPattern value="%property{Operator}" />

        </layout>

      </parameter>

 

      <!--操作對象-->

      <parameter>

        <parameterName value="@operand" />

        <dbType value="String" />

        <size value="300" />

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

          <conversionPattern value="%property{Operand}" />

        </layout>

      </parameter>

 

      <!IP地址-->

      <parameter>

        <parameterName value="@ip" />

        <dbType value="String" />

        <size value="20" />

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

          <conversionPattern value="%property{IP}" />

        </layout>

      </parameter>

 

      <!--機器名-->

      <parameter>

        <parameterName value="@machineName" />

        <dbType value="String" />

        <size value="100" />

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

          <conversionPattern value="%property{MachineName}" />

        </layout>

      </parameter>

 

      <!--瀏覽器-->

      <parameter>

        <parameterName value="@browser" />

        <dbType value="String" />

        <size value="50" />

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

          <conversionPattern value="%property{Browser}" />

        </layout>

      </parameter>

     

      <!日誌消息-->

      <parameter>

        <parameterName value="@message" />

        <dbType value="String" />

        <size value="3000" />

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

          <conversionPattern value="%property{Message}" />

        </layout>

      </parameter>

 

      <!--動作類型-->

      <parameter>

        <parameterName value="@action_type" />

        <dbType value="Int16" />

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

          <conversionPattern value="%property{ActionType}" />

        </layout>

      </parameter>

 

      <!記錄日誌的位置-->

      <parameter>

        <parameterName value="@location" />

        <dbType value="String" />

        <size value="2000" />

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%location" />

        </layout>

      </parameter>

     

      <!異常信息。ExceptionLayout 爲異常輸出的默認格式-->

      <parameter>

        <parameterName value="@exception" />

        <dbType value="String" />

        <size value="4000" />

        <layout type="log4net.Layout.ExceptionLayout" />

      </parameter>

</appender>

注意:

向表中輸出的字段不能多於數據表本身字段,而反之則可以,但這些多餘字段一定使其可以爲空,否則便寫不到數據庫;

輸出字段的類型一定是對應數據表字段數據類型可以隱式轉換的,而且長度也不能超過,否則也不能寫入;

數據表字段設置儘量可以爲空,這樣可以避免一條日誌記錄存在空數據導致後面的日誌都記錄不了。

4.3<logger>的配置

在配置文件<appender>中的配置好了輸出的介質,格式,過濾方式,還要定義日誌對象<logger>

在框架的體系裏,所有的日誌對象都是根日誌(root logger)的後代。 因此如果一個日誌對象沒有在配置文件裏顯式定義,則框架使用根日誌中定義的屬性。在<root>標籤裏,可以定義level級別值和Appender的列表。如果沒有定義LEVEL的值,則缺省爲DEBUG。可以通過<appender-ref>標籤定義日誌對象使用的Appender對象。<appender-ref>聲明瞭在其他地方定義的Appender對象的一個引用。在一個logger對象中的設置會覆蓋根日誌的設置。而對Appender屬性來說,子日誌對象則會繼承父日誌對象的Appender列表。這種缺省的行爲方式也可以通過顯式地設定<logger>標籤的additivity屬性爲false而改變。

<root>不顯式申明時使用默認的配置。我覺得在使用時不定義<root>,自定義多個<logger>,在程序中記錄日誌時直接使用<logger>name來查找相應的<logger>,這樣更靈活一些。例如:

<!--同時寫兩個文件和數據庫-->

<logger name="ReflectionLayout">

      <level value="DEBUG"/>

      <appender-ref ref="HashtableLayout"/>

      <appender-ref ref="ReflectionLayout"/>

      <appender-ref ref="ADONetAppender"/>

</logger>

4.4關聯配置文件

log4net默認關聯的是應用程序的配置文件App.config(BS程序是Web.config),可以使用程序集自定義屬性來進行設置。下面來介紹一下這個自定義屬性:

log4net.Config.XmlConifguratorAttribute

 

XmlConfiguratorAttribute3個屬性:

ConfigFile 配置文件的名字,文件路徑相對於應用程序目錄

(AppDomain.CurrentDomain.BaseDirectory)ConfigFile屬性不能和ConfigFileExtension屬性一起使用。

ConfigFileExtension 配置文件的擴展名,文件路徑相對於應用程序的目錄。ConfigFileExtension屬性不能和ConfigFile屬性一起使用。

Watch 如果將Watch屬性設置爲true,就會監視配置文件。當配置文件發生變化的時候,就會重新加載。

如果ConfigFileConfigFileExtension都沒有設置,則使用應用程序的配置文件App.configWeb.config)。

 

可以在項目的AssemblyInfo.cs文件裏添加以下的語句:

 //監視默認的配置文件,App.exe.config   

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

 

//監視配置文件,App.exe.log4net

[assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]

 

//使用配置文件log4net.config,不監視改變。注意log4net.config文件的目錄,BS程序在站點目錄//下,CS則在應用程序啓動目錄下,如調試時在\bin\Debug下,一般將文件屬性的文件輸出目錄調爲//始終複製即可

[assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]

 

//使用配置文件log4net.config,不監視改變

[assembly: log4net. Config.XmlConfigurator()]

 

也可以在Global.asaxApplication_Start裏或者是Program.cs中的Main方法中添加,注意這裏一定是絕對路徑,如下所示:

//這是在BS程序下,使用自定義的配置文件log4net.xml,使用Server.MapPath("~") + //@"\log4net.xml來取得路徑。 \log4net.xml爲相對於站點的路徑

// ConfigureAndWatch()相當於Configure(Watch = true)

log4net.Config.XmlConfigurator.ConfigureAndWatch(

new System.IO.FileInfo(Server.MapPath("~") + @"\log4net.xml"));

//這是在CS程序下,可以用以下方法獲得:

string assemblyFilePath = Assembly.GetExecutingAssembly().Location;

string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);

string configFilePath = assemblyDirPath + " ";

log4net.Config.XmlConfigurator.ConfigureAndWatch(

new FileInfo(configFilePath));

 

或直接使用絕對路徑:

//使用自定義的配置文件,直接絕對路徑爲:c:/log4net.config

log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));

 

5、如何記錄日誌

Log4net使用很方便,先申明一個封裝類ILog 的對象,如下:

log4net.ILog log = log4net.LogManager.GetLogger("ReflectionLayout");

其中"ReflectionLayout"便是我們自定義的日誌對象<logger>name的值。

對應5個日誌輸出級別,log個方法,每個方法都有兩個重載,使用如下:

try

            {

                log.Debug("這是一個測試!");

            }

            catch(Exception ec)

            {

                log.Error("出現錯誤!", ec);

         }

如果我們需要輸出的消息是要區別開來,不按一個字符串全部輸出,就需要進行一些擴展了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章