標籤:alt ima img [] object roo token class 分享
一. Log4Net 簡介
Log4net 是 Apache 下一個開放源碼的項目,我們可以控制日誌資訊的輸出目的地(資料庫、控制台、文字文件、檔案)。Log4net中定義了多種日誌資訊輸出模式。
在做項目的時候令我最頭疼的是在程式發布到正式環境之後出現了問題,我們不能調試而且問題很難重新,於是我們需要大量的日誌資料來精確的跟蹤程式的健全狀態。
Log4net就可以幫我來解決這一個難題,對於日誌的輸出我們不需要人為的去幹涉,它可以根據需要將日誌輸出到控制台,文字檔,windows 日誌事件檢視器中,包括資料庫,郵件等等位置,以便我們快速跟蹤程式bug。
二. Log4Net 簡單使用
使用Log4net必須引入log4net.DLL 檔案,因為log4net 是開源的,所以可以直接將源碼添加到工程項目中去。然後產生新的dll檔案。
1.首先引用Log4Net.dll
2.如果是在Web程式中,我們可以將這句話添加到 Global.asax 檔案的Application_Start(object sender, EventArgs e) 方法中,在程式啟動的時候就初始化配置資訊:
log4net.Config.XmlConfigurator.Configure(); --這句話相當於初始化註冊Log4net ,
註:如果不是Web程式則每次調用時候寫這句話。
3.配置web.config
下面使用配置一個最簡單的檔案輸出和控制台輸出。
Log4Net 的設定檔,此段內容添加到App.config 或者 web.config 檔案中:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="D:\a.log"></file>
<appendToFile value="true"></appendToFile>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="ERROR"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</ log4net>
控制台程式測試例子:
ILog log = LogManager.GetLogger("MyLogger");
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
Program program = new Program();
program.log.Info(">>>>>>>>>>>>>>");
program.log.Info(">>>>>>>>>>>>>>1");
program.log.Info(">>>>>>>>>>>>>>2");
}
註:上述例子是不會輸出任何日誌資訊的,因為配置層級的限制。 下面我們來看下日誌的結構
三. Log4Net 結構
Log4net 主要分為5個核心組件: Logger, Appender, Filter, Layout, Object Render。
Logger:
主要用於記錄日誌的分類和控制日誌的層級。它可以以多種格式輸出日誌資訊,同時它也可以控制日誌的輸出層級。上面的簡單例子我們看似做了日誌輸出,但是沒有輸出任何日誌結果,因為我們在記錄層級上做了限制。
Appender:
這裡我們簡單稱之為“附著器”。意思就是說日誌的輸出必須依賴於它,更確切的說以文本形式輸出,還是控制台格式輸出都必須要依靠它來控制。Log4net定義了多種附著器:
(1) AdoNetAppender 將日誌記錄到資料庫中。可以採用SQL和預存程序兩種方式 。
(2) AnsiColorTerminalAppender 在ANSI 視窗終端寫下高亮度的日誌事件。
(3) AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日誌。
(4) BufferingForwardingAppender 在輸出到子Appenders之前先緩衝日誌事件。
(5) ConsoleAppender 將日誌輸出到控制台。
(6) EventLogAppender 將日誌寫到Windows Event Log。
(7) FileAppender 將日誌寫到檔案中。
(8) MemoryAppender 將日誌存到記憶體緩衝區。
(9) NetSendAppender 將日誌輸出到Windows Messenger service,這些日誌資訊將在使用者終端的對話方塊中顯示。
(10) RemoteSyslogAppender 通過UDP網路通訊協定將日誌寫到Remote syslog service。
(11) RemotingAppender 通過.NET Remoting將日誌寫到遠程接收端。
(12) RollingFileAppender 將日誌以復原檔案的形式寫到檔案中。
(13) SmtpAppender 將日誌寫到郵件中。
(14) TraceAppender 將日誌寫到.NET trace 系統。
(15) UdpAppender 將日誌connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。
Filter:
Appender 是將日誌以預設值的方式輸出,意思就是按照預設值的方式輸出。而Filter 意思就是過濾器,使用Filter 可以將日誌以不同格式來輸出。
Layout:
這個用於控制日誌輸出顯示格式。
Object Render:
用於按照使用者自訂標準來輸出日誌。
Log4net 結構圖 (從其他地方過來)
Log4net 的日誌對象管理器LogManager:LogManager是用於來管理所有的Logger對象的,GetLogger() 可以用來尋找已經存在的Logger對象,如果對象不存在它會自動建立一個Logger對象,並且管理它。
四. Log4Net 記錄層級
Log4net 分為如下幾個層級:
FATAL 毀滅層級
ERROR 錯誤層級
WARN 警告層級
INFO 訊息層級
DEBUG 調試層級
這幾種記錄層級高低:FATAL> ERROR> WARN > INFO > DEBUG。
只有日誌輸出層級大於或等於配置的層級才能輸出日誌資訊。
比如我的日誌配置層級為INFO,那麼只有log.Info(), log.Warn(), log.Error(), log.Fatal()才能輸出日誌資訊,Debug方式就不能輸出。
Log4net中還有兩種特殊的配置層級: ALL - 允許所有的記錄層級輸出,OFF - 拒絕所有的記錄層級輸出。
五. Log4Net 配置說明
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--記錄日誌到資料庫-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=GAS-HECHEN;initial catalog=dsc141051_db;integrated security=false;persist security info=True;User ID=sa;Password=000000" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!--輸入日誌到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[時間]:%d%n[層級]:%p%n[內容]:%m%n%n"></conversionPattern>
</layout>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="file" value="D:\a.log"></param>
<param name="appendToFile" value="true"></param>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[時間]:%d%n[層級]:%p%n[內容]:%m%n%n"></conversionPattern>
</layout>
</appender>
<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</log4net>
這個設定檔定義了三種不同的Appender,分別是ADO.NET 記錄到資料,ConsoleAppender 從控制台輸出, FileAppender 日誌資訊檔輸出。
然而Log4Net 的配置附著器遠不止這些,這裡上傳一個比較全的附著器設定檔供大家參考 點擊下載。
根據上面的日誌設定檔仍然使用如下代碼測試:
這裡需要注意,log4net.Config.XmlConfigurator.Configure(); 這個相當於初始化Log4net, 如果是在Web程式中,我們可以將這句話添加到 Global.asax 檔案的Application_Start(object sender, EventArgs e) 方法中,在程式啟動的時候就初始化配置資訊。
上面的程式運行結果圖,控制台輸出結果為:
資訊記錄到指定的磁碟檔案中,記錄的結果如:
這裡說明兩個配置:
這裡的 root 和 logger 配置節點,root 就相當於預設的日誌對象配置,而logger是指定特定的日誌配置。他們可以共存。
對於這兩個節點下面都有 level 和 appender-ref 節點,分別用於指定日誌的輸出層級和引用哪些附著器。每個日誌對象都可以使用多個appender,這裡的配置同時使用檔案輸出和控制台輸出。得到的結果就是上面兩個結果圖。
下面的logger對象添加了AdoNetAppender附著器,當使用MyLogger日誌對象的時候就會使用這三種不同的方式記錄日誌。
上面的程式聲明了兩個日誌對象 log 和 log1,log 是在初始化的時候存在的,它得到的是<logger name="MyLogger"> 這個日誌對象,而log1 是 LogManager 中不存在的日誌對象,這裡它會重新建立一個並且由LogManager 管理,後面再次使用則使用這個已經存在的對象。 這裡兩個日誌對象同時使用結果如下:
現在我修改設定檔的記錄檔輸出層級:
<logger name="MyLogger">
<level value="WARN"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
<appender-ref ref="AdoNetAppender"></appender-ref>
</ logger>
運行得到的結果
顯然MyLogger對象日誌沒有輸出日誌資訊。
六. Log4Net 參數說明
上面我們看到的設定檔中有類似 %m %n 等這樣的符號,這些符號都是有特殊意義的。
%m[%message] : 輸出的日誌訊息
%n : 換行
%d[%datetime] : 輸出當前語句啟動並執行時刻
%r : 輸出程式從運行到執行到當前語句時消耗的毫秒數
%d : 當前語句所在的線程ID
%p : 日誌的當前優先順序別
%c :當前日誌對象的名稱
%L : 輸出語句所在的行號
%F :輸出語句所在的檔案名稱
%-數字 :表示該項的最小長度,如果不夠,則用空格填充
Log4Net日誌記錄簡單使用講解