Log4net簡介
Log4net 是Apache組織開發的著名的開源日志記錄組件,可以以插件的形式應用在應用系統中。利用Log4net可以方便的將日志信息記錄到文件,Windows事件日志和數據庫中(MS SQL SERVER,ORACLE等)。並且我們還可以控制要記載的日志級別,可以記載的日志級別包括:
1、FATAL (致命錯誤)
2、ERROR(一般錯誤)
3、WARN(警告)
4、INFO(一般信息)
5、DEBUG(調試信息)
log4net有4中主要組件,分別是Logger(記錄器),Repository(庫),Appender(附着器),Layout(布局)
Logger 提供了多種方式來記錄一個日志信息,可以在你的應用程序里創建多個Logger,每個實例化的Logger對象都被Log4net框架作為命名實體來維護。
Log4net框架定義了一個叫做LogManager的類,用來管理所有的Logger對象。它有一個靜態的GetLogger()靜態方法,用我們提供的名字參數來檢索已經存在的logger對象,如果框架不存在該Logger對象,它也會為我們創建一個Logger對象。
級別 |
允許的方法 |
Boolean屬性 |
優先級別 |
OFF |
|
|
最高 |
FATAL |
VoidFatal(object message) |
Bool IsFatalEnabled |
|
ERROR |
Void Error(object message) |
Bool IsErrorEnabled |
|
WARN |
Void Warn(object message) |
Bool IsWarnEnabled |
|
INFO |
Void Info(object message) |
Bool IsInfoEnabled |
|
DEBUG |
Void Debug(object message) |
Bool IsDebugEnabled |
|
ALL |
|
|
最低 |
在Log4net框架里,通過設置配置文件,每個日志對象都被分配了一個日志優先級
例如,當創建一個日志對象,並且把它的級別設置為<level value="INFO"/> 框架會設置日志的每個Boolean屬性,當你調用相應的日志方法時候,框架會檢查相應的Boolean屬性,決定該方法能不能被執行。

1 Logger.Info("Hello World"); 2 Logger.DEBUG("Hello World"); 3 Logger.WARN("Hello World");
對於第一種方法,能夠得到輸出
對於第二種方法,不能得到輸出,Debug的優先級低於Info
對於第三種,能夠得到輸出。
Appender
設定日志輸出的目的地,負責向存儲介質中追加日志,在配置文件中配置,通常有
AdoNetAppender
EventLogAppender
RollingFileAppender
Layout 日志消息記錄的格式,在配置文件中進行配置
%m (message) 輸出日志的消息
%n (new line) 換行
%d (datetime) 輸出當前語句的運行時間
%r(run time) 輸出程序從運行到執行再到當前語句的所耗費毫秒數
%t (thread id)當前語句的線程id
%p 日志的當前優先級別
%c 當前日志對象的名稱
%L 輸出語句所在的行號
%F 輸出語句所在文件名
%-數字 表示該項的最小長度。
使用步驟:
1,項目中添加Log4net.dll引用
2,在web.config中進行配置:

1 <configSections> 2 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 3 </configSections> 4 <log4net> 5 <!-- <root> 6 <level value="ALL"/> 7 <appender-ref ref="rootFile"/> 8 </root>--> 9 <logger name="AppLogger1"> 10 <level value="INFO"/> 11 <appender-ref ref="LogFileAppender"/> 12 </logger> 13 <logger name="AppLogger2"> 14 <level value="DEBUG"/> 15 <appender-ref ref="rollingFile"/> 16 </logger> 17 <appender name="LogFileAppender" type="Log4net.Appender.FileAppender"> 18 <param name="File" value="App.log"/> 19 <param name="AppendToFile" value="true"/> 20 <layout type="log4net.Layout.PatternLayout"> 21 <param name="Header" value="--start-- "/> 22 <param name="Footer" value="--end-- "/> 23 <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] %X(auth) - %m%n"/> 24 </layout> 25 <filter type="log4net.Filter.LevelRangeFilter"> 26 <param name="LevelMin" value="DEBUG"/> 27 <param name="LevelMax" value="FATAL"/> 28 </filter> 29 </appender> 30 <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net"> 31 <param name="File" type="" value="log/"/> 32 <param name="AppendToFile" value="true"/> 33 <param name="RollingStyle" value="Date"/> 34 <param name="DatePattern" value="yyyy-MM-dd"/> 35 <param name ="StaticLogFileName" value="false"/> 36 <layout type="log4net.Layout.PatternLayout,log4net"> 37 <param name="ConversionPattern" value="%d [%t] %-5p %c %L %F - %m%n"/> 38 <param name="Header" value="--start-- "/> 39 <param name="Footer" value="--end-- "/> 40 </layout> 41 </appender> 42 </log4net>
Log4net下有root,logger,appender標簽
root標簽,所有的logger都從root繼承,root本身也是一個logger,root的設置在所有的Logger中都起作用,當在root和Logger中重復設定相同 的appender時,同一日志信息將被記錄兩次。
logger標簽,每個logger標簽代表一個logger,appender-ref表示該logger產生的日志消息傳遞給哪個appender,一個logger可以把相同的消息傳遞給多個appender記錄。
appender標簽,每個appender表示一個日志的存儲位置,name不能和type一樣。
3、在Global.ascx中的Application_Start方法加入:
void Application_Start(object sender, EventArgs e)
{
//在應用程序啟動時運行的代碼
log4net.Config.XmlConfigurator.Configure();
}
4、調用代碼:
log4net.ILog log = log4net.LogManager.GetLogger("AppLogger2");
log.Error("Hello World");
以上面的配置,舉個SQL SERVER例子:
結果集:
--start--
2012-05-20 21:06:31,406 [5] ERROR AppLogger2 0 - ExecuteNonQuery 要求已打開且可用的 Connection。連接的當前狀態為已關閉。
2012-05-20 21:06:45,296 [6] ERROR AppLogger2 0 - ExecuteNonQuery 要求已打開且可用的 Connection。連接的當前狀態為已關閉。
--end--

1 log4net.ILog log = log4net.LogManager.GetLogger("AppLogger2"); 2 try 3 { 4 string connectionString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString; 5 using (SqlConnection con = new SqlConnection(connectionString)) 6 { 7 SqlCommand cmd = new SqlCommand("DELETE FROM Categories WHERE CategoryID= 10 ", con); 8 cmd.ExecuteNonQuery(); 9 } 10 } 11 catch (Exception ex) 12 { 13 log.Error(ex.Message); 14 return; 15 }