Log4net日誌記錄元件的使用詳解
首先我們來分析一下Log4net的工作原理:
Log4net是基於.NET開發的一款非常著名的記錄日誌開源元件。它通過一套XML配置的日誌引擎,將日誌分不同的等級,分別是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允許所有的日誌請求)和OFF(拒絕所有的日誌請求),預設為DEBUG,前五個可以看到和我們平常在除錯應用程式的出錯有點類似,在編譯器中也會留下如錯誤、警告之類的提示資訊,它們的錯誤級別不斷的降低。
我們接著看Log4net的核心組成部分,Log4net主要由五個部分組成,分別為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是如何在.NET環境下實現日誌的記錄的。
一、 檔案記錄方式:
我們考慮一下這樣的情況,首先我們要把日誌的記錄檔案存放到一個記事本文件中,另外,隨著應用程式執行的時間不斷增長,寫入這個記事本檔案的內容也會越來越大,這個時候,我們可能會想如果按天來生成日誌檔案或者檔案大小到達一定的大小時就自動增加一個新的日誌檔案,無疑會提高我們檢查日誌的效率,Log4net就可以輕鬆的實現這樣的功能。我們看具體的應用,步驟如下:
1) 首先建立一個Windows應用程式的專案,然後需要增加應用程式的配置檔案App.Config,如果在WEB應用程式中,就需要配置Web.Config,然後新增引用,加入之前我們在網上下載的Log4net.dll檔案,然後在AssemblyInfo.cs檔案里加入下面的語句:
[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]
2) 在配置檔案裡面設定如下:
< ?xml version="1.0" encoding="utf-8" ?>
< configuration>
< !--日誌配置部分-->
< configSections>
< section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
< /configSections>
< !-- Log4net配置設定 -->
< log4net debug="false">
< appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">< !--RollingFileAppender將日誌以回滾檔案的形式寫到檔案中-->
< file value="log.txt" />< !--輸出日誌檔案的路徑-->
< appendToFile value="true" />< !--輸出日誌時自動向後追加-->
< rollingStyle value="Composite" />
< datePattern value=".yyyyMMdd" />< !--輸出日期格式-->
< maxSizeRollBackups value="10" />< !--日誌最大個數-->
< maximumFileSize value="1MB" />< !--單個日誌的最大容量-->
< staticLogFileName value="true" />< !--true表示當前最新日誌檔名永遠為file節中-->
< layout type="log4net.Layout.PatternLayout">
< conversionPattern value="%date %-5level %logger -%m%n" />
< /layout>
< /appender>
< root>
< level value="WARN" />
< appender-ref ref="RollingLogFileAppender" />
< /root>
< /log4net>
< /configuration>
%d, %date :表示當然的時間
%level : 表示日誌的級別
%logger, %c:表示日誌產生的主題,通常是所在的類名,便於定位問題
%m, %message :表示日誌的具體內容
%n, %newline: 換行
3) 然後在Form視窗的程式碼裡先定義下面的介面:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
我們可以在視窗中拖動一個Button控制元件,然後在它的Click事件中,寫入以下的程式碼:
log.Error("這是一個錯誤日誌");
log.Fatal("這是一個致命的錯誤日誌");
log.Warn("這是一個警告日誌");
執行過後,然後點選Button,可以看到生成一個log.txt日誌檔案,裡面寫入的內容如下:
2009-06-01 21:16:54,171 ERROR Log4netApp.Form1 -這是一個錯誤日誌
2009-06-01 21:16:54,187 FATAL Log4netApp.Form1 -這是一個致命的錯誤日誌
2009-06-01 21:16:54,187 WARN Log4netApp.Form1 -這是一個警告日誌
當我們在第二天再執行此程式時,就會發現到前一天生成的檔案已經改名成log.txt.加上年月日了,效果如圖一:
圖一 日誌檔案列表
二、 資料庫記錄的方式:
1) 建立存入日誌的資料表LogInfo
CREATE TABLE [dbo].[LogInfo] (
[AddDate] [datetime] NOT NULL,
[Message] [varchar] (2000) NOT NULL
)
2) 建立一個ASP.NET WEB專案,並將log4net.dll新增到引用。然後在AssemblyInfo.cs中加入下面的程式碼:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
3) 新增一個全域性應用程式類Global.asax,然後在Application_Start事件裡新增下面的程式碼:
log4net.Config.XmlConfigurator.Configure();
4) 接下來需要在Web.Config檔案裡面配置詳細的資料庫設定,如下:
< ?xml version="1.0"?>
< configuration>
< !--日誌配置部分-->
< configSections>
< section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
< /configSections>
< appSettings/>
< connectionStrings/>
< system.web>
< compilation debug="true" />
< authentication mode="Windows" />
< /system.web>
< !-- Log4net配置設定 -->
< log4net>
< logger name="LogRecord">
< level value="ALL" />
< appender-ref ref="AdoNetAppender_SqlServer" />
< /logger>
< appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
< bufferSize value="1"/>< !--log資訊記錄的緩衝大小 -->
< connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
< connectionString value="data source=(local);initial catalog=test1;integrated security=false;persist security info=True;User ID=sa;Password="/>< !--資料庫連線字串 -->
< commandText value="INSERT INTO LogInfo([AddDate],[Message]) Values( @log_date,@message)"/> < !--資料庫插入 -->
< parameter>
< parameterName value="@log_date" />
< dbType value="DateTime" />
< layout type="log4net.Layout.RawTimeStampLayout" />< !--當前日期 -->
< /parameter>
< parameter>
< parameterName value="@message" />
< dbType value="String" />
< size value="2000" />
< layout type="log4net.Layout.PatternLayout">< !--後臺日誌的資訊 -->
< conversionPattern value="%message" />
< /layout>
< /parameter>
< /appender>
< /log4net>
< /configuration>
5) 然後在頁面上拖一個Button控制元件和一個Label控制元件,在Button控制元件的點選事件中寫入以下程式碼:
try
{
ILog logger = LogManager.GetLogger("LogRecord");
logger.Debug("用Log4Net寫入資料庫日誌");
}
catch (Exception ex)
{
throw ex;
}
finally
{
lbMsg.Text="操作日誌已經記錄到資料庫";
}
執行後,點選按鈕,點選幾次,就會在庫中增加幾條記錄,效果如圖二:
圖二 Log4net插入資料庫
以上介紹的是Log4net常用的兩種日誌的記錄方法,在實際應用中,還有其它的記錄方法,如控制檯的應用、將日誌的資訊傳送到指定的郵箱。
可以見得,在開發過程中我們在運用Log4net時,可以給我們的應用程式帶來豐富的體驗度,通過提高日誌的記錄效能,可以精確的控制日誌資訊的輸出,在.NET中,可以方便的通過配置檔案,就方便日誌的記錄,Log4net還有其它很多豐富的應用功能,感興趣的朋友可以進一步的去研究它。