日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

log4net配置

 蘿卜2014 2014-05-22

1、概述

log4net.Net下一個(gè)非常優(yōu)秀的開(kāi)源日志記錄組件。log4net記錄日志的功能非常強(qiáng)大。它可以將日志分不同的等級(jí),以不同的格式,輸出到不同的媒介。本文主要是介紹如何在Visual Studio2008中使用log4net快速創(chuàng)建系統(tǒng)日志,如何擴(kuò)展以輸出自定義字段。

2、一個(gè)簡(jiǎn)單的使用實(shí)例

第一步:在項(xiàng)目中添加對(duì)log4net.dll的引用,這里引用版本是1.2.10.0。

第二步:程序啟動(dòng)時(shí)讀取log4net的配置文件。

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

log4net.Config.XmlConfigurator.Configure();

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

log4net.Config.XmlConfigurator.Configure();

無(wú)論BS還是CS程序都可直接在項(xiàng)目的AssemblyInfo.cs文件里添加以下的語(yǔ)句:

[assembly: log4net.Config .XmlConfigurator()]

也可以使用自定義的配置文件,具體請(qǐng)參見(jiàn)4.4 關(guān)聯(lián)配置文件。

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

App.config文件添加內(nèi)容如下:

<?xmlversion="1.0"encoding="utf-8" ?>

<configuration>

  <configSections>

<sectionname="log4net"

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

  </configSections>

 

  <log4net>

    <root>

      <levelvalue="WARN" />

      <appender-refref="LogFileAppender" />

      <appender-refref="ConsoleAppender" />

    </root>

 

    <loggername="testApp.Logging">

      <levelvalue="DEBUG"/>

    </logger>

 

    <appendername="LogFileAppender" type="log4net.Appender.FileAppender" >

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

      <paramname="AppendToFile"value="true" />

 

      <layouttype="log4net.Layout.PatternLayout">

        <paramname="Header"value="[Header]"/>

        <paramname="Footer"value="[Footer]"/>

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

      </layout>

 

      <filtertype="log4net.Filter.LevelRangeFilter">

        <paramname="LevelMin"value="DEBUG" />

        <paramname="LevelMax"value="WARN" />

      </filter>

    </appender>

 

    <appendername="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >

      <layouttype="log4net.Layout.PatternLayout">

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

      </layout>

    </appender>

 

  </log4net>

</configuration>

第四步:在程序使用。

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

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

這樣就將信息同時(shí)輸出到控制臺(tái)和寫(xiě)入到文件名為"log-file.txt"的文件中,其中"log-file.txt"文件的路徑是當(dāng)前程序運(yùn)行所在目錄;也可以定義為絕對(duì)路徑,配置如:

<paramname="File"value="C:\log-file.txt" />就寫(xiě)入C盤(pán)根目錄下log-file.txt文件中,具體使用技巧參見(jiàn)4.2.1。

 

本例的實(shí)現(xiàn)請(qǐng)參見(jiàn)8.6附件。

3、Log4net的主要組成部分

3.1 Appenders

Appenders用來(lái)定義日志的輸出方式,即日志要寫(xiě)到那種介質(zhì)上去。較常用的Log4net已經(jīng)實(shí)現(xiàn)好了,直接在配置文件中調(diào)用即可,可參見(jiàn)上面配置文件例子;當(dāng)然也可以自己寫(xiě)一個(gè),需要從log4net.Appender.AppenderSkeleton類繼承。它還可以通過(guò)配置FiltersLayout來(lái)實(shí)現(xiàn)日志的過(guò)濾和輸出格式。

已經(jīng)實(shí)現(xiàn)的輸出方式有:

AdoNetAppender將日志記錄到數(shù)據(jù)庫(kù)中??梢圆捎?/SPAN>SQL和存儲(chǔ)過(guò)程兩種方式。

AnsiColorTerminalAppender 將日志高亮輸出到ANSI終端。

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

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

ConsoleAppender將日志輸出到應(yīng)用程序控制臺(tái)。

EventLogAppender將日志寫(xiě)到Windows Event Log。

FileAppender 將日志輸出到文件。

ForwardingAppender 發(fā)送日志事件到子Appenders。

LocalSyslogAppender 將日志寫(xiě)到local syslog service (僅用于UNIX環(huán)境下)。

MemoryAppender 將日志存到內(nèi)存緩沖區(qū)。

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

OutputDebugStringAppender將日志輸出到Debuger,如果程序沒(méi)有Debuger,就輸出到系統(tǒng)Debuger。如果系統(tǒng)Debuger也不可用,將忽略消息。

RemoteSyslogAppender 通過(guò)UDP網(wǎng)絡(luò)協(xié)議將日志寫(xiě)到Remote syslog service。

RemotingAppender通過(guò).NET Remoting將日志寫(xiě)到遠(yuǎn)程接收端。

RollingFileAppender將日志以回滾文件的形式寫(xiě)到文件中。

SmtpAppender將日志寫(xiě)到郵件中。

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

TelnetAppender客戶端通過(guò)Telnet來(lái)接受日志事件。

TraceAppender將日志寫(xiě)到.NET trace 系統(tǒng)。

UdpAppender將日志以無(wú)連接UDP數(shù)據(jù)報(bào)的形式送到遠(yuǎn)程宿主或用UdpClient的形式廣播。

3.2 Filters

使用過(guò)濾器可以過(guò)濾掉Appender輸出的內(nèi)容。過(guò)濾器通常有以下幾種:

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

LevelMatchFilter 只有指定等級(jí)的日志事件才被記錄

LevelRangeFilter日志等級(jí)在指定范圍內(nèi)的事件才被記錄

LoggerMatchFilter Logger名稱匹配,才記錄

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

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

3.3 Layouts

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

一個(gè)Appender只能有一個(gè)Layout。

最常用的Layout應(yīng)該是經(jīng)典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayoutExceptionLayout。然后還有IRawLayout,XMLLayout等幾個(gè),使用較少。Layout可以自己實(shí)現(xiàn),需要從log4net.Layout.LayoutSkeleton類繼承,來(lái)輸出一些特殊需要的格式,在后面擴(kuò)展時(shí)就重新實(shí)現(xiàn)了一個(gè)Layout。

SimpleLayout簡(jiǎn)單輸出格式,只輸出日志級(jí)別與消息內(nèi)容。

RawTimeStampLayout 用來(lái)格式化時(shí)間,在向數(shù)據(jù)庫(kù)輸出時(shí)會(huì)用到。

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

ExceptionLayout需要給Logger的方法傳入Exception對(duì)象作為參數(shù)才起作用,否則就什么也不輸出。輸出的時(shí)候會(huì)包含MessageTrace。

PatterLayout使用最多的一個(gè)Layout,能輸出的信息很多,使用方式可參見(jiàn)上面例子中的配置文件。PatterLayout的格式化字符串見(jiàn)文后附注8.1

3.4 Loggers

Logger是直接和應(yīng)用程序交互的組件。Logger只是產(chǎn)生日志,然后由它引用的Appender記錄到指定的媒介,并由Layout控制輸出格式。

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

日志的等級(jí),它們由高到底分別為:

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

高于等級(jí)設(shè)定值方法(如何設(shè)置參見(jiàn)"配置文件詳解")都能寫(xiě)入日志,Off所有的寫(xiě)入方法都不寫(xiě)到日志里,ALL則相反。例如當(dāng)我們?cè)O(shè)成Info時(shí),logger.Debug就會(huì)被忽略而不寫(xiě)入文件,但是FATAL, ERROR,WARN,INFO會(huì)被寫(xiě)入,因?yàn)樗麄兊燃?jí)高于INFO。

在具體寫(xiě)日志時(shí),一般可以這樣理解日志等級(jí):

FATAL(致命錯(cuò)誤):記錄系統(tǒng)中出現(xiàn)的能使用系統(tǒng)完全失去功能,服務(wù)停止,系統(tǒng)崩潰等使系統(tǒng)無(wú)法繼續(xù)運(yùn)行下去的錯(cuò)誤。例如,數(shù)據(jù)庫(kù)無(wú)法連接,系統(tǒng)出現(xiàn)死循環(huán)。

ERROR(一般錯(cuò)誤):記錄系統(tǒng)中出現(xiàn)的導(dǎo)致系統(tǒng)不穩(wěn)定,部分功能出現(xiàn)混亂或部分功能失效一類的錯(cuò)誤。例如,數(shù)據(jù)字段為空,數(shù)據(jù)操作不可完成,操作出現(xiàn)異常等。

WARN(警告):記錄系統(tǒng)中不影響系統(tǒng)繼續(xù)運(yùn)行,但不符合系統(tǒng)運(yùn)行正常條件,有可能引起系統(tǒng)錯(cuò)誤的信息。例如,記錄內(nèi)容為空,數(shù)據(jù)內(nèi)容不正確等。

INFO(一般信息):記錄系統(tǒng)運(yùn)行中應(yīng)該讓用戶知道的基本信息。例如,服務(wù)開(kāi)始運(yùn)行,功能已經(jīng)開(kāi)戶等。

DEBUG (調(diào)試信息):記錄系統(tǒng)用于調(diào)試的一切信息,內(nèi)容或者是一些關(guān)鍵數(shù)據(jù)內(nèi)容的輸出。

Logger實(shí)現(xiàn)的ILog接口,ILog定義了5個(gè)方法(Debug,Inof,Warn,Error,Fatal)分別對(duì)不同的日志等級(jí)記錄日志。這5個(gè)方法還有5個(gè)重載。以Debug為例說(shuō)明一下,其它的和它差不多。

ILog中對(duì)Debug方法的定義如下:

void Debug(object message);

void Debug(object message, Exception ex);

還有一個(gè)布爾屬性:

bool IsDebugEnabled { get; }

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

最后還要說(shuō)一個(gè)LogManager類,它用來(lái)管理所有的Logger。它的GetLogger靜態(tài)方法,可以獲得配置文件中相應(yīng)的Logger

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

3.5 Object Renders

它將告訴logger如何把一個(gè)對(duì)象轉(zhuǎn)化為一個(gè)字符串記錄到日志里。(ILog中定義的接口接收的參數(shù)是Object,而不是String。)

例如你想把Orange對(duì)象記錄到日志中,但此時(shí)logger只會(huì)調(diào)用Orange默認(rèn)的ToString方法而已。所以要定義一個(gè)OrangeRender類實(shí)現(xiàn)log4net.ObjectRender.IObjectRender接口,然后注冊(cè)它(我們?cè)诒疚闹械臄U(kuò)展不使用這種方法,而是直接實(shí)現(xiàn)一個(gè)自定義的Layout)。這時(shí)logger就會(huì)知道如何把Orange記錄到日志中了。

3.6 Repository

Repository主要用于日志對(duì)象組織結(jié)構(gòu)的維護(hù)。

4、配置文件詳解

4.1 配置文件構(gòu)成

主要有兩大部分,一是申明一個(gè)名為"log4net"的自定義配置節(jié),如下所示:

  <configSections>

<sectionname="log4net"

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

  </configSections>

二是<log4net>節(jié)的具體配置,這是下面要重點(diǎn)說(shuō)明的。

4.1.1<log4net>

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

支持的屬性:

debug

可選,取值是truefalse,默認(rèn)是false。設(shè)置為true,開(kāi)啟log4net的內(nèi)部調(diào)試。

update

可選,取值是Merge(合并)Overwrite(覆蓋),默認(rèn)值是Merge。設(shè)置為Overwrite,在提交配置的時(shí)候會(huì)重置已經(jīng)配置過(guò)的庫(kù)。

threshold

可選,取值是repository(庫(kù))中注冊(cè)的level,默認(rèn)值是ALL。

支持的子元素:

appender

0或多個(gè)

logger

0或多個(gè)

renderer

0或多個(gè)

root

最多一個(gè)

param

0或多個(gè)

 

4.1.2<root>

實(shí)際上就是一個(gè)根logger,所有其它logger都默認(rèn)繼承它,如果配置文件里沒(méi)有顯式定義,則框架使用根日志中定義的屬性root元素沒(méi)有屬性。

支持的子元素:

appender-ref

0個(gè)或多個(gè),要引用的appender的名字。

level

最多一個(gè)。只有在這個(gè)級(jí)別或之上的事件才會(huì)被記錄。

param

0個(gè)或多個(gè),設(shè)置一些參數(shù)。

 

4.1.3<logger>

支持的屬性:

name

必須的,logger的名稱

additivity

可選,取值是truefalse,默認(rèn)值是true。設(shè)置為false時(shí)將阻止父logger中的appender。

支持的子元素:

appender-ref

0個(gè)或多個(gè),要引用的appender的名字。

level

最多一個(gè)。只有在這個(gè)級(jí)別或之上的事件才會(huì)被記錄。

param

0個(gè)或多個(gè),設(shè)置一些參數(shù)。

 

4.1.4<appender>

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

支持的屬性:

name

必須的,Appender對(duì)象的名稱

type

必須的,Appender對(duì)象的輸出類型

支持的子元素:

appender-ref

0個(gè)或多個(gè),允許此appender引用其他appender,并不是所以appender類型都支持。

filter

0個(gè)或多個(gè),定義此app使用的過(guò)濾器。

layout

最多一個(gè)。定義appender使用的輸出格式。

param

0個(gè)或多個(gè),設(shè)置Appender類中對(duì)應(yīng)的屬性的值。

實(shí)際上<appender>所能包含的子元素遠(yuǎn)不止上面4個(gè)。

 

4.1.5<layout>

布局,只能作為<appender>的子元素。

支持的屬性:

type

必須的,Layout的類型

支持的子元素:

param

0個(gè)或多個(gè),設(shè)置一些參數(shù)。

 

4.1.6<filter>

過(guò)濾器,只能作為<appender>的子元素。

支持的屬性:

type

必須的,Filter的類型

支持的子元素:

param

0個(gè)或多個(gè),設(shè)置一些參數(shù)。

 

4.1.7<param>

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

支持的屬性:

name

必須的,取值是父對(duì)象的參數(shù)名。

value

可選的,valuetype中,必須有一個(gè)屬性被指定。value是一個(gè)能被轉(zhuǎn)化為參數(shù)值的字符串。

type

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

支持的子元素:

param

0個(gè)或多個(gè),設(shè)置一些參數(shù)。

 

4.2 <appender>配置

   <appender>在配置文件中至少有一個(gè),也可以有多個(gè),有些<appender>類型還可以引用其他<appender>類型,具體參數(shù)可參見(jiàn)上表。

下面只對(duì)寫(xiě)入回滾文件與輸出到數(shù)據(jù)庫(kù)(這里使用SQL數(shù)據(jù)庫(kù))配置體會(huì)說(shuō)一下,其他配置可參考官方網(wǎng)站:http://logging./log4net/release/config-examples.html

4.2.1寫(xiě)入回滾文件

    <appendername="ReflectionLayout"type="log4net.Appender.RollingFileAppender,log4net">

<!--日志文件路徑,"/"與"\"作用相同,到達(dá)的目錄相同,文件夾不存在則新建-->

<!--按文件大小方式輸出時(shí)在這里指定文件名,并且當(dāng)天的日志在下一天時(shí)在文件名后自動(dòng)追加當(dāng)天日期形成新文件。-->

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

<!--param的名稱,可以直接查對(duì)應(yīng)的appender類的屬性名即可,這里要查的就是RollingFileAppender類的屬性 -->

      <paramname="File"value="D:/Log/" />

 

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

      <paramname="AppendToFile"value="true" />

 

      <!--記錄日志寫(xiě)入文件時(shí),不鎖定文本文件,防止多線程時(shí)不能寫(xiě)Log,官方說(shuō)線程非安全-->

      <lockingModeltype="log4net.Appender.FileAppender+MinimalLock" />

 

      <!使用Unicode編碼-->

      <Encodingvalue="UTF-8" />

 

      <!--最多產(chǎn)生的日志文件數(shù),超過(guò)則只保留最新的n個(gè)。設(shè)定值value="1"為不限文件數(shù)-->

      <paramname="MaxSizeRollBackups"value="10" />

 

      <!--是否只寫(xiě)到一個(gè)文件中-->

      <paramname="StaticLogFileName"value="false" />

 

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

      <paramname="RollingStyle"value="Composite" />

 

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

<!此處按日期產(chǎn)生文件夾,文件名固定。注意"的位置-->

      <paramname="DatePattern"value="yyyy-MM-dd/"ReflectionLayout.log""  />

<!這是按日期產(chǎn)生文件夾,并在文件名前也加上日期-->

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

<!這是先按日期產(chǎn)生文件夾,再形成下一級(jí)固定的文件夾>

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

 

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

超出大小后在所有文件名后自動(dòng)增加正整數(shù)重新命名,數(shù)字最大的最早寫(xiě)入。

可用的單位:KB|MB|GB。不要使用小數(shù),否則會(huì)一直寫(xiě)入當(dāng)前日志-->

      <paramname="maximumFileSize"value="500KB" />

 

<!--計(jì)數(shù)類型為1,2,3-->
      
<paramname="CountDirection"value="1"/>

 

<!過(guò)濾設(shè)置,LevelRangeFilter為使用的過(guò)濾器。 -->

      <filtertype="log4net.Filter.LevelRangeFilter">

        <paramname="LevelMin"value="DEBUG" />

        <paramname="LevelMax"value="WARN" />

      </filter>

 

      <!--記錄的格式。一般用log4net.Layout.PatternLayout布局-->

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

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

      <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

        <paramname="ConversionPattern"

 value="記錄時(shí)間:?te 線程ID:[%thread] 日志級(jí)別:%-5level 記錄類:%logger     操作者ID%property{Operator} 操作類型:%property{Action}%n             當(dāng)前機(jī)器名:%property%n當(dāng)前機(jī)器名及登錄用戶:%username %n               記錄位置:%location%n 消息描述:%property{Message}%n                    異常:%exception%n 消息:%message%newline%n%n" />

      </layout>

</appender>

注意這些配置屬性有些是可選的,如果需要,一定要寫(xiě)正確,否則要么輸出的不是自己想要的結(jié)果,要么干脆不輸出任何信息。

4.2.1寫(xiě)入SQL數(shù)據(jù)庫(kù)

需要在相應(yīng)的數(shù)據(jù)庫(kù)中準(zhǔn)備好一張表,創(chuàng)建語(yǔ)句如下:

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

)

<appendername="ADONetAppender"type="log4net.Appender.ADONetAppender,log4net">

<!--BufferSize為緩沖區(qū)大小,只有日志記錄超設(shè)定值才會(huì)一塊寫(xiě)入到數(shù)據(jù)庫(kù)-->

<bufferSizevalue="10" /><!或?qū)憺?SPAN lang=EN-US XML:LANG="EN-US"><param name="BufferSize" value="10" />-->

 

<!--引用-->

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

 

<!--連接數(shù)據(jù)庫(kù)字符串-->

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

 

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

<commandTextvalue="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)" />

 

<!日志記錄時(shí)間,RawTimeStampLayout為默認(rèn)的時(shí)間輸出格式-->

      <parameter>

        <parameterNamevalue="@log_date" />

        <dbTypevalue="DateTime" />

        <layouttype="log4net.Layout.RawTimeStampLayout" />

      </parameter>

 

      <!--線程號(hào)-->

      <parameter>

        <parameterNamevalue="@thread" />

        <dbTypevalue="String" />

<!長(zhǎng)度不可以省略,否則不會(huì)輸出-->

        <sizevalue="100" />

        <layouttype="log4net.Layout.PatternLayout">

          <conversionPatternvalue="%thread" />

        </layout>

      </parameter>

 

      <!--日志等級(jí)-->

      <parameter>

        <parameterNamevalue="@log_level" />

        <dbTypevalue="String" />

        <sizevalue="100" />

        <layouttype="log4net.Layout.PatternLayout">

          <conversionPatternvalue="%level" />

        </layout>

      </parameter>

 

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

      <parameter>

        <parameterNamevalue="@logger" />

        <dbTypevalue="String" />

        <sizevalue="200" />

        <layouttype="log4net.Layout.PatternLayout">

          <conversionPatternvalue="%logger" />

        </layout>

      </parameter>

     

      <!--操作者。這個(gè)是自定義的輸出字段,使用重新實(shí)現(xiàn)的布局器ReflectionLayout -->

      <parameter>

        <parameterNamevalue="@operator" />

<!設(shè)置為Int32時(shí)只有bufferSizevalue<="1"才正確輸出,沒(méi)有找出原因。-->

        <dbTypevalue="Int16" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{Operator}" />

        </layout>

      </parameter>

 

      <!--操作對(duì)象-->

      <parameter>

        <parameterNamevalue="@operand" />

        <dbTypevalue="String" />

        <sizevalue="300" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{Operand}" />

        </layout>

      </parameter>

 

      <!IP地址-->

      <parameter>

        <parameterNamevalue="@ip" />

        <dbTypevalue="String" />

        <sizevalue="20" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{IP}" />

        </layout>

      </parameter>

 

      <!--機(jī)器名-->

      <parameter>

        <parameterNamevalue="@machineName" />

        <dbTypevalue="String" />

        <sizevalue="100" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{MachineName}" />

        </layout>

      </parameter>

 

      <!--瀏覽器-->

      <parameter>

        <parameterNamevalue="@browser" />

        <dbTypevalue="String" />

        <sizevalue="50" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{Browser}" />

        </layout>

      </parameter>

     

      <!日志消息-->

      <parameter>

        <parameterNamevalue="@message" />

        <dbTypevalue="String" />

        <sizevalue="3000" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{Message}" />

        </layout>

      </parameter>

 

      <!--動(dòng)作類型-->

      <parameter>

        <parameterNamevalue="@action_type" />

        <dbTypevalue="Int16" />

        <layouttype="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPatternvalue="%property{ActionType}" />

        </layout>

      </parameter>

 

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

      <parameter>

        <parameterNamevalue="@location" />

        <dbTypevalue="String" />

        <sizevalue="2000" />

        <layouttype="log4net.Layout.PatternLayout">

          <conversionPatternvalue="%location" />

        </layout>

      </parameter>

     

      <!異常信息。ExceptionLayout為異常輸出的默認(rèn)格式-->

      <parameter>

        <parameterNamevalue="@exception" />

        <dbTypevalue="String" />

        <sizevalue="4000" />

        <layouttype="log4net.Layout.ExceptionLayout" />

      </parameter>

</appender>

注意:

向表中輸出的字段不能多于數(shù)據(jù)表本身字段,而反之則可以,但這些多余字段一定使其可以為空,否則便寫(xiě)不到數(shù)據(jù)庫(kù);

輸出字段的類型一定是對(duì)應(yīng)數(shù)據(jù)表字段數(shù)據(jù)類型可以隱式轉(zhuǎn)換的,而且長(zhǎng)度也不能超過(guò),否則也不能寫(xiě)入;

數(shù)據(jù)表字段設(shè)置盡量可以為空,這樣可以避免一條日志記錄存在空數(shù)據(jù)導(dǎo)致后面的日志都記錄不了。

4.3<logger>的配置

在配置文件<appender>中的配置好了輸出的介質(zhì),格式,過(guò)濾方式,還要定義日志對(duì)象<logger>。

在框架的體系里,所有的日志對(duì)象都是根日志(root logger)的后代。 因此如果一個(gè)日志對(duì)象沒(méi)有在配置文件里顯式定義,則框架使用根日志中定義的屬性。在<root>標(biāo)簽里,可以定義level級(jí)別值和Appender的列表。如果沒(méi)有定義LEVEL的值,則缺省為DEBUG??梢酝ㄟ^(guò)<appender-ref>標(biāo)簽定義日志對(duì)象使用的Appender對(duì)象。<appender-ref>聲明了在其他地方定義的Appender對(duì)象的一個(gè)引用。在一個(gè)logger對(duì)象中的設(shè)置會(huì)覆蓋根日志的設(shè)置。而對(duì)Appender屬性來(lái)說(shuō),子日志對(duì)象則會(huì)繼承父日志對(duì)象的Appender列表。這種缺省的行為方式也可以通過(guò)顯式地設(shè)定<logger>標(biāo)簽的additivity屬性為false而改變。

<root>不顯式申明時(shí)使用默認(rèn)的配置。我覺(jué)得在使用時(shí)不定義<root>,自定義多個(gè)<logger>,在程序中記錄日志時(shí)直接使用<logger>name來(lái)查找相應(yīng)的<logger>,這樣更靈活一些。例如:

<!--同時(shí)寫(xiě)兩個(gè)文件和數(shù)據(jù)庫(kù)-->

<loggername="ReflectionLayout">

      <levelvalue="DEBUG"/>

      <appender-refref="HashtableLayout"/>

      <appender-refref="ReflectionLayout"/>

      <appender-refref="ADONetAppender"/>

</logger>

4.4關(guān)聯(lián)配置文件

log4net默認(rèn)關(guān)聯(lián)的是應(yīng)用程序的配置文件App.config(BS程序是Web.config),可以使用程序集自定義屬性來(lái)進(jìn)行設(shè)置。下面來(lái)介紹一下這個(gè)自定義屬性:

log4net.Config.XmlConifguratorAttribute。

 

XmlConfiguratorAttribute3個(gè)屬性:

ConfigFile 配置文件的名字,文件路徑相對(duì)于應(yīng)用程序目錄

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

ConfigFileExtension 配置文件的擴(kuò)展名,文件路徑相對(duì)于應(yīng)用程序的目錄。ConfigFileExtension屬性不能和ConfigFile屬性一起使用。

Watch 如果將Watch屬性設(shè)置為true,就會(huì)監(jiān)視配置文件。當(dāng)配置文件發(fā)生變化的時(shí)候,就會(huì)重新加載。

如果ConfigFileConfigFileExtension都沒(méi)有設(shè)置,則使用應(yīng)用程序的配置文件App.configWeb.config)。

 

可以在項(xiàng)目的AssemblyInfo.cs文件里添加以下的語(yǔ)句:

 //監(jiān)視默認(rèn)的配置文件,App.exe.config   

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

 

//監(jiān)視配置文件,App.exe.log4net

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

 

//使用配置文件log4net.config,不監(jiān)視改變。注意log4net.config文件的目錄,BS程序在站點(diǎn)目錄//下,CS則在應(yīng)用程序啟動(dòng)目錄下,如調(diào)試時(shí)在\bin\Debug下,一般將文件屬性的文件輸出目錄調(diào)為//始終復(fù)制即可

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

 

//使用配置文件log4net.config,不監(jiān)視改變

[assembly: log4net. Config.XmlConfigurator()]

 

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

//這是在BS程序下,使用自定義的配置文件log4net.xml,使用Server.MapPath("~") + //@"\log4net.xml"來(lái)取得路徑。 \log4net.xml為相對(duì)于站點(diǎn)的路徑

// ConfigureAndWatch()相當(dāng)于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(

newFileInfo(configFilePath));

 

或直接使用絕對(duì)路徑:

//使用自定義的配置文件,直接絕對(duì)路徑為:c:/log4net.config

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

 

5、如何記錄日志

Log4net使用很方便,先申明一個(gè)封裝類ILog的對(duì)象,如下:

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

其中"ReflectionLayout"便是我們自定義的日志對(duì)象<logger>name的值。

對(duì)應(yīng)5個(gè)日志輸出級(jí)別,log5 個(gè)方法,每個(gè)方法都有兩個(gè)重載,使用如下:

try

            {

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

            }

            catch(Exception ec)

            {

                log.Error("出現(xiàn)錯(cuò)誤!", ec);

         }

如果我們需要輸出的消息是要區(qū)別開(kāi)來(lái),不按一個(gè)字符串全部輸出,就需要進(jìn)行一些擴(kuò)展了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多