一、Log4net簡介
日志記錄往往是軟件開發周期中的重要組成部分。它具有以下幾個優點:它可以提供應用程序運行時的精確環境,可供開發人員盡快找到應用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運行過程中就能生成並輸出日志信息而無需人工干預。
Log4net是一個非常不錯的日志組件,使用方式也很簡單,只需要通過配置就能夠方便使用。
二、輸出日志到文本文件
輸出日志到文本文件非常簡單。
1、配置文件的操作,增加一個配置節
<configSections> <!--添加一個自定義log4net節點組--> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections>
2、配置內容
<log4net> <!--定義輸出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定義文件存放位置--> <file value="D:\123.txt" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--變換的形式為日期--> <rollingStyle value="Date" /> <!--日期的格式--> <datePattern value="yyyyMMdd-HH:mm:ss" /> <!--以日志文件大小變換文件名--> <rollingStyle value="Size" /> <!--最大變換數量,-1為不限制--> <maxSizeRollBackups value="-1" /> <!--最大文件大小(1G切換)--> <maximumFileSize value="1GB" /> <layout type="log4net.Layout.PatternLayout"> <!--每條日志末尾的文字說明--> <footer value="by Mr.Jun" /> <!--輸出格式--> <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" /> </layout> </appender> <root> <!--文件形式記錄日志(僅僅輸出文件形式)--> <appender-ref ref="LogFileAppender" /> </root> </log4net>
3、命名空間頂部需要增加
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
4、測試代碼
public ActionResult Index() { int i = 1 - 1; int j = 10; int k; try { k = j / i; } catch(Exception e) { //創建日志記錄組件實例 ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); //記錄錯誤日志 log.Error("error", e); } return View(); }
4、輸出內容
記錄時間:2014-04-11 14:54:07,680 線程ID:[11] 日志級別:ERROR 出錯類:MvcApplication5.Controllers.HomeController property:[(null)] - 錯誤描述:error System.DivideByZeroException: 嘗試除以零。 在 MvcApplication5.Controllers.HomeController.Index() 位置 C:\Users\ChenZhuo\documents\visual studio 2010\Projects\MvcApplication5\MvcApplication5\Controllers\HomeController.cs:行號 25
三、日志輸出到郵件
此處要實現的功能是,當錯誤級別達到error,則保存日志並發送郵件,當級別低於error時,僅僅保存日志文件。
增加配置節后,配置內容如下:
<log4net> <!--根據logger獲取ILog對象--> <logger name="logger"> <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ALL" /> <appender-ref ref="LogSmtpAppender" /> <appender-ref ref="LogFileAppender" /> </logger> <!--定義輸出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定義文件存放位置--> <file value="D:\123.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd-HH:mm:ss" /> <layout type="log4net.Layout.PatternLayout"> <!--輸出格式--> <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日志級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" /> </layout> </appender> <!--定義郵件發送--> <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender"> <authentication value="Basic" /> <to value="xxx@qq.com" /> <from value="xxx@163.com" /> <username value="xxx@163.com" /> <password value="xxx" /> <subject value="XXX應用錯誤日志消息" /> <smtpHost value="smtp.163.com" /> <bufferSize value="2048" /> <!--超長部分是否丟棄--> <lossy value="true" /> <!--日志級別 大於 WARN 的才發郵件--> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="ERROR"/> </evaluator> <!--定義郵件的格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" /> </layout> </appender> </log4net>
命名空間頂部:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
測試代碼:
public ActionResult Index() { int i = 1 - 1; int j = 10; int k; try { k = j / i; } catch(Exception e) { //創建日志記錄組件實例 ILog log = log4net.LogManager.GetLogger("logger"); //記錄錯誤日志 log.Error("error", e); } return View(); }
發送的郵件內容如下:
四、更多配置說明
具體說來有如下Appender:
Appender | 說明 |
AdoNetAppender | 利用ADO.NET記錄到數據庫的日志 |
AnsiColorTerminalAppender | 在ANSI 窗口終端寫下高亮度的日志事件 |
AspNetTraceAppender | 能用asp.net中Trace的方式查看記錄的日志 |
BufferingForwardingAppender | 在輸出到子Appenders之前先緩存日志事件 |
ConsoleAppender | 將日志輸出到控制台 |
EventLogAppender | 將日志寫到Windows Event Log |
FileAppender | 將日志寫到文件中 |
LocalSyslogAppender | 將日志寫到local syslog service |
MemoryAppender | 將日志存到內存緩沖區 |
NetSendAppender | 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示 |
RemoteSyslogAppender | 通過UDP網絡協議將日志寫到Remote syslog service |
RemotingAppender | 通過.NET Remoting將日志寫到遠程接收端 |
RollingFileAppender | 將日志以回滾文件的形式寫到文件中 |
SmtpAppender | 將日志寫到郵件中 |
TraceAppender | 將日志寫到.NET trace 系統 |
UdpAppender | 將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播 |
參數說明
參數 | 說明 |
%m(message) | :輸出的日志消息,如ILog.Debug(…)輸出的一條消息 |
%n(new line) | 換行 |
%d(datetime) | 輸出當前語句運行的時刻 |
%r(run time) | 輸出程序從運行到執行到當前語句時消耗的毫秒數 |
%t(thread id) | 當前語句所在的線程ID |
%p(priority) | 日志的當前優先級別,即DEBUG、INFO、WARN…等 |
%c(class) | 當前日志對象的名稱 |
%f(file) | 輸出語句所在的文件名 |
%l(line) | 輸出語句所在的行號 |
%數字 | 表示該項的最小長度,如果不夠,則用空格填充 |
五、使用說明
1、關聯配置文件
當我們創建了上面的配置文件后,我們接下來需要把它和我們的應用聯系起來。缺省的,每個獨立的可執行程序集都會定義它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的級別上定義配置文件。
例如:可以在項目的AssemblyInfo.cs文件里添加以下的語句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)]
- ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴展名。
- ConfigFileExtension:如果我們對被編譯程序的程序集使用了不同的文件擴展名,那么我們需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。
- Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在運行時監視文件的改變。如果這個屬性為true,那么FileSystemWatcher將會被用來監視文件的改變,重命名,刪除等事件。
其中:ConfigFile和ConfigFileExtension屬性不能同時使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”
2、創建或獲取日志對象
日志對象會使用在配置文件里定義的屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據繼承結構獲取祖先節點的屬性,最終的,會從根日志獲取屬性。如下所示:
Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
3、輸出日志信息
可以使用ILog的幾種方法輸出日志信息。你也可以在調用某方法前先檢查IsXXXEnabled布爾變量,再決定是否調用輸出日志信息的函數,這樣可以提高程序的性能。因為框架在調用如ILog.Debug(…)這樣的函數時,也會先判斷是否滿足Level日志級別條件。
if (log.IsDebugEnabled) log.Debug("message"); if (log.IsInfoEnabled) log.Info("message);