Log4Net日誌記錄兩種方式

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   

本文轉載:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010

簡介

     log4net庫是Apache log4j架構在Microsoft .NET平台的實現,是一個協助程式員將日誌資訊輸出到各種目標(控制台、檔案、資料庫等)的工具。
     log4net是Apache軟體基金會Apache Logging Services工程的一部分。ApacheLog Service工程致力於為程式調試和審計提供跨語言的Log Service。(f:百度百科)

原理

     Log4net是基於.NET開發的一款記錄日誌開源組件。它通過一套XML配置的日誌引擎,將日誌分不同的等級,分別是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允許所有的日誌請求)和OFF(拒絕所有的日誌請求),預設為DEBUG,前五個是不是很熟悉?可以看到和我們平常在調試應用程式的出錯有點類似,在編譯器中也會留下如錯誤、警告之類的提示資訊,它們的錯誤層級在不斷的降低。

log4net開源項目結構:

     通過查看源碼,log4net主要有5個核心部分組成,分別為Logger,Appenders, Filters, Layouts 和Object Renders,在設定檔中它們以節點的形式出現。

  1.  Logger:主要負責日誌的記錄,它記錄的方式有多種,可以是以檔案、資料庫、控制台、郵件等多處方式;
  2. Appenders:主要負責記錄日誌介質的方式,它的輸出方式主要包括:
    • AdoNetAppender:將日誌記錄到資料庫中。可以採用SQL和預存程序兩種方式
    • AspNetTraceAppender:能用ASP.NET中跟蹤的方式查看記錄的日誌。

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

    • ColoredConsoleAppender:在終端的視窗寫下高亮度的日誌事件。
    • ConsoleAppender:將日誌輸出到控制台。
    • EventLogAppender:將日誌寫到Windows作業系統的日誌中去。
    • FileAppender:將日誌寫到檔案中。
    • ForwardingAppender:用來為一個Appender指定一組約束。
    • MemoryAppender:將日誌存到記憶體緩衝區。
    • NetSendAppender:將日誌輸出到Windows Messenger service,這些日誌資訊將在使用者終端的對話方塊中顯示。
    • OutputDebugStringAppender:配置該Appender以向OutputDebugString API寫入日誌。
    • RemotingAppender:通過.NET Remoting將日誌寫到遠程接收端。
    • RollingFileAppender:將日誌以復原檔案的形式寫到檔案中。
    • SmtpAppender:將日誌寫到郵件中。
    • SmtpPickupDirAppender:配置與SmtpAppender類似,但要把SmtpHost換為PickupDir。
    • TraceAppender:將日誌寫到.NET trace 系統。
    • UdpAppender:將日誌connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。

     以上有些輸出方式可能會經常用到(比如寫入檔案和資料庫的方式),有些可能會不經常用到(郵件方式等),具體我們在下面舉例來說明。

    3.Layouts:主要負責把記錄日誌格式化輸出,顯示得格式主要如下:

        %timestamp [%thread] %-5level %logger{2} %ndc - %message%newline

  timestamp: 表示程式已經開始執行的時間。 單位[毫秒]。

  Thread:執行當前代碼的線程。

  Level:日誌的層級。

  Logger:日誌相關請求的名稱。

  Message:日誌訊息。

  newline:換行。

案例一:檔案記錄方式

     首先引用Log4net.dll,然後在添加一個設定檔log4net.config(這裡不將配置資訊寫入web.config,個人覺得寫在一起實在太亂)中添加下面的配置資訊(注意應和web.config處於相同的位置,即根目錄下):

 1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3   <!--日誌配置部分--> 4   <configSections> 5     <!--註冊lognet--> 6     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 7   </configSections> 8   <log4net debug="false"> 9     <root>10       <priority value="ALL"/>11       <appender-ref ref="TraceAppender"/>12       <appender-ref ref="ConsoleAppender"/>13       <appender-ref ref="RollingFileAppender"/>14     </root>15     <appender name="TraceAppender" type="log4net.Appender.TraceAppender">16       <layout type="log4net.Layout.PatternLayout">17         <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>18       </layout>19     </appender>20     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">21       <layout type="log4net.Layout.PatternLayout">22         <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>23       </layout>24     </appender>25     <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">26       <file value="Log\SysLog"/>27       <!--記錄檔夾及檔案名稱開頭-->28       <appendToFile value="true"/>29       <!--是否追加到檔案-->30       <RollingStyle value="Date"/>31       <!--日期的格式-->32       <DatePattern value="yyyy-MM-dd"/>33       <!--檔案名稱後面加上.log尾碼,必須使用逸出字元-->34       <maximumFileSize value="1MB" />35       <!--最大檔案大小-->36       <StaticLogFileName value="false"/>37       <!--記錄檔名是否為靜態-->38       <layout type="log4net.Layout.PatternLayout,log4net">39         <param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>40         <param name="Header" value=" ------------------網站運行過程中產生的錯誤-------------------------- "/>41         <param name="Footer" value=" -----------------測試:GZQ------------------------------------- "/>42       </layout>43     </appender>44   </log4net>45   <!--End網站日誌配置部分-->46 </configuration>

      %d, %date :表示當然的時間
  %level : 表示日誌的層級
  %logger, %c:表示日誌產生的主題,通常是所在的類名,便於定位問題
  %m, %message :表示日誌的具體內容
  %n, %newline: 換行

     在AssemblyInfo.cs中添加如下代碼:

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

     在全域處理常式中添加如下代碼:

1         protected void Application_Start(object sender, EventArgs e)2         {3             log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));4         }

測試

     在頁面添加button和一個label,在button的單擊事件中添加如下代碼:

 1         protected void btnShowTime_Click(object sender, EventArgs e) 2         { 3             log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 4             myLogger.Warn("這是一個警告日誌"); 5             myLogger.Info("單擊了按鈕"); 6             myLogger.Debug("用Log4Net寫入資料庫日誌"); 7             myLogger.Error("這是一個錯誤記錄檔"); 8             myLogger.Fatal("這是一個致命的錯誤記錄檔"); 9             try10             {11                 ILog logger = LogManager.GetLogger("LogRecord");12                 logger.Debug("用Log4Net寫入資料庫日誌");13                 int x = 5;14                 int y = 0;15                 Response.Write(x / y);16             }17             catch (Exception ex)18             {19                 myLogger.Error(ex);20             }21             finally22             {23                 lblShow.Text = DateTime.Now.ToLongTimeString()+":動作記錄已記錄完成";24             }25         }

結果
 

案例二:日誌記入資料庫

      記入資料庫的方式和記入檔案的方式大同小異,主要區別在設定檔,其他步驟相同,記入資料庫的設定檔log4net.config如下:

 1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3   <configSections> 4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 5   </configSections> 6   <!--Log4net Begin--> 7   <log4net> 8     <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> 9       <bufferSize value="1" />10       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />11       <connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />12       <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />13       <parameter>14         <parameterName value="@log_date" />15         <dbType value="DateTime" />16         <layout type="log4net.Layout.RawTimeStampLayout" />17       </parameter>18       <parameter>19         <parameterName value="@thread" />20         <dbType value="String" />21         <size value="100" />22         <layout type="log4net.Layout.PatternLayout">23           <conversionPattern value="%t" />24         </layout>25       </parameter>26       <parameter>27         <parameterName value="@log_level" />28         <dbType value="String" />29         <size value="200" />30         <layout type="log4net.Layout.PatternLayout">31           <conversionPattern value="%p" />32         </layout>33       </parameter>34       <parameter>35         <parameterName value="@logger" />36         <dbType value="String" />37         <size value="500" />38         <layout type="log4net.Layout.PatternLayout">39           <conversionPattern value="%logger" />40         </layout>41       </parameter>42       <parameter>43         <parameterName value="@message" />44         <dbType value="String" />45         <size value="3000" />46         <layout type="log4net.Layout.PatternLayout">47           <conversionPattern value="%m" />48         </layout>49       </parameter>50       <parameter>51         <parameterName value="@exception" />52         <dbType value="String" />53         <size value="4000" />54         <layout type="log4net.Layout.ExceptionLayout" />55       </parameter>56     </appender>57     <!-- setup the root category, add the appenders and set the default level -->58     <root>59       <level value="WARN"/>60       <level value="INFO"/>61       <level value="DEBUG"/>62       <level value="FINE"/>63       <appender-ref ref="ADONetAppender" />64     </root>65     <!-- specify the level for some specific categories -->66     <logger name="iNotes">67       <level value="WARN"/>68       <level value="INFO"/>69       <level value="DEBUG"/>70       <level value="FINE"/>71       <appender-ref ref="ADONetAppender"/>72     </logger>73     <logger name="StellaLogger">74       <level value="ALL"/>75       <appender-ref ref="AdoNetAppender" />76     </logger>77   </log4net>78   <!--Log4net End-->79 </configuration>

     建立記錄日誌的資料表:

 1     CREATE TABLE [dbo].[ErrorLog](    2  3     [nId] [bigint] IDENTITY(1,1) NOT NULL,    4  5     [dtDate] [datetime] NOT NULL,    6  7     [sThread] [varchar](100) NOT NULL,    8  9     [sLevel] [varchar](200) NOT NULL,   10 11     [sLogger] [varchar](500) NOT NULL,   12 13     [sMessage] [varchar](3000) NOT NULL,   14 15     [sException] [varchar](4000) NULL)

測試
     採用上面的測試方法。

結果

      

結語

     項目中經常用到的兩種方式在這裡做一下總結。其他方式,用到了再補上。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.