乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      log4net配置

       蘿卜2014 2014-05-22

      1、概述

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

      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 關聯(lián)配置文件。

      第三步:修改配置文件。如果是CS程序,則在默認的App.config文件(沒有新建一個)中添加內(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");//獲取一個日志記錄器

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

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

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

       

      本例的實現(xiàn)請參見8.6附件。

      3、Log4net的主要組成部分

      3.1 Appenders

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

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

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

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

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

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

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

      EventLogAppender將日志寫到Windows Event Log。

      FileAppender 將日志輸出到文件。

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

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

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

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

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

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

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

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

      SmtpAppender將日志寫到郵件中。

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

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

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

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

      3.2 Filters

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

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

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

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

      LoggerMatchFilter Logger名稱匹配,才記錄

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

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

      3.3 Layouts

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

      一個Appender只能有一個Layout

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

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

      RawTimeStampLayout 用來格式化時間,在向數(shù)據(jù)庫輸出時會用到。

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

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

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

      3.4 Loggers

      Logger是直接和應用程序交互的組件。Logger只是產(chǎn)生日志,然后由它引用的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(致命錯誤):記錄系統(tǒng)中出現(xiàn)的能使用系統(tǒng)完全失去功能,服務停止,系統(tǒng)崩潰等使系統(tǒng)無法繼續(xù)運行下去的錯誤。例如,數(shù)據(jù)庫無法連接,系統(tǒng)出現(xiàn)死循環(huán)。

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

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

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

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

      Logger實現(xiàn)的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靜態(tài)方法,可以獲得配置文件中相應的Logger

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

      3.5 Object Renders

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

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

      3.6 Repository

      Repository主要用于日志對象組織結(jié)構的維護。

      4、配置文件詳解

      4.1 配置文件構成

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

        <configSections>

      <sectionname="log4net"

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

        </configSections>

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

      4.1.1<log4net>

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

      支持的屬性:

      debug

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

      update

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

      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個或多個,設置一些參數(shù)。

       

      4.1.3<logger>

      支持的屬性:

      name

      必須的,logger的名稱

      additivity

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

      支持的子元素:

      appender-ref

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

      level

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

      param

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

       

      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個或多個,設置一些參數(shù)。

       

      4.1.6<filter>

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

      支持的屬性:

      type

      必須的,Filter的類型

      支持的子元素:

      param

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

       

      4.1.7<param>

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

      支持的屬性:

      name

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

      value

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

      type

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

      支持的子元素:

      param

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

       

      4.2 <appender>配置

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

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

      4.2.1寫入回滾文件

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

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

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

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

      <!--param的名稱,可以直接查對應的appender類的屬性名即可,這里要查的就是RollingFileAppender類的屬性 -->

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

       

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

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

       

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

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

       

            <!使用Unicode編碼-->

            <Encodingvalue="UTF-8" />

       

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

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

       

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

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

       

            <!--按照何種方式產(chǎn)生多個日志文件(日期[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)生文件夾,再形成下一級固定的文件夾>

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

       

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

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

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

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

       

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

       

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

            <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="記錄時間:?te 線程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>

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

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

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

      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ù)據(jù)庫-->

      <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ù)庫字符串-->

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

       

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

            <parameter>

              <parameterNamevalue="@log_date" />

              <dbTypevalue="DateTime" />

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

            </parameter>

       

            <!--線程號-->

            <parameter>

              <parameterNamevalue="@thread" />

              <dbTypevalue="String" />

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

              <sizevalue="100" />

              <layouttype="log4net.Layout.PatternLayout">

                <conversionPatternvalue="%thread" />

              </layout>

            </parameter>

       

            <!--日志等級-->

            <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>

           

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

            <parameter>

              <parameterNamevalue="@operator" />

      <!設置為Int32時只有bufferSizevalue<="1"才正確輸出,沒有找出原因。-->

              <dbTypevalue="Int16" />

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

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

              </layout>

            </parameter>

       

            <!--操作對象-->

            <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>

       

            <!--機器名-->

            <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>

       

            <!--動作類型-->

            <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為異常輸出的默認格式-->

            <parameter>

              <parameterNamevalue="@exception" />

              <dbTypevalue="String" />

              <sizevalue="4000" />

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

            </parameter>

      </appender>

      注意:

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

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

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

      4.3<logger>的配置

      在配置文件<appender>中的配置好了輸出的介質(zhì),格式,過濾方式,還要定義日志對象<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>,這樣更靈活一些。例如:

      <!--同時寫兩個文件和數(shù)據(jù)庫-->

      <loggername="ReflectionLayout">

            <levelvalue="DEBUG"/>

            <appender-refref="HashtableLayout"/>

            <appender-refref="ReflectionLayout"/>

            <appender-refref="ADONetAppender"/>

      </logger>

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

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

      log4net.Config.XmlConifguratorAttribute

       

      XmlConfiguratorAttribute3個屬性:

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

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

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

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

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

       

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

       //監(jiā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程序在站點目錄//下,CS則在應用程序啟動目錄下,如調(diào)試時在\bin\Debug下,一般將文件屬性的文件輸出目錄調(diào)為//始終復制即可

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

       

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

      [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(

      newFileInfo(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個日志輸出級別,log5 個方法,每個方法都有兩個重載,使用如下:

      try

                  {

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

                  }

                  catch(Exception ec)

                  {

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

               }

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多