一、作用
提供一個記錄日志的框架,可以將日志信息記錄到文件、控制台、Windows事件日志和數據庫(MSSQL、Acess、Oracle、DB2和SQLite等)。
二、先看看示例,感受一下吧
config配置文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <log4net> <!-- 定義日志的輸出媒介 --> <root> <appender-ref ref="ConsoleAppender"/> <appender-ref ref="R"/> </root> <!-- 定義輸出到控制台 --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> </layout> </appender> <!-- 定義輸出到日志文件 --> <appender name="R" type="log4net.Appender.FileAppender" rollingStyle="Date" datePattern="yyyyMMdd-HH:mm:ss"> <file value="logs/log.txt"></file> <appendToFile value="true"></appendToFile> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-d{yyyy-MM-dd HH\:mm\:ss} [%L] [%c]-[%p] %m%n"></conversionPattern> </layout> </appender> </log4net> </configuration>
cs文件
/** * 指定log4net使用.config文件來讀取配置信息 * 若為Winform(假定程序為Demo.exe), 那么配置文件則為Demo.exe.config * 若為Webform,則為web.config */ [assembly:log4net.Config.XmlConfigurator(Watch=true)] namespace Demo{ public class MainClass{ public static void Main(String[] args){ ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); log.Error("error", new Exception("there is an exception")); log.Fatal("fatal", new Exception("there is a deadly exception occurs")); log.Info("info"); log.Debug("debug"); log.Warn("warn"); Console.Read(); } } }
三、框架的核心組件
1. Appender
作用:用於定義日志信息的輸出介質(文件、控制台、Windows事件日志和數據庫(MSSQL、Acess、Oracle、DB2和SQLite等))
內置的Appdner組件:
ConsoleAppender ,輸出介質為控制台
FileAppender ,輸出介質為文件,示例如下
<appender name="FileAppender" type="log4net.Appender.FileAppender" file="logs/log.txt" appendToFile="true"> <layout type="log4net.Layout.PatternLayout"> .......... </layout> </appender>
RollingFileAppender ,將日志以回滾文件的形式寫入文件中。可以指定文件最大容量,當超過就生成一個新文件來記錄,且可以指定最多生成日志文件數量,當超過時則覆蓋從第一個日志文件開始循環覆蓋。
示例1:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" file="logs/log.txt" appendToFile="true" rollingStyle="Size" maxSizeRollBackups="10" maximumFileSize="100KB" staticLogFileName="true"> <layout type="log4net.Layout.PatternLayout"> .......... </layout> </appender>
示例2:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" file="logs/log.txt" appendToFile="true" rollingStyle="Date" datePattern="yyyyMMdd"> <layout type="log4net.Layout.PatternLayout"> .......... </layout> </appender>
EventLogAppender ,輸出介質為系統日志
AdoNetAppender ,輸出介質為數據庫,示例如下
<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient" /> <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" /> <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> <bufferSize value="128" /> <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> </appender>
自定義Appender時,需要繼承 log4net.Appender.AppenderSkeleton
2. Layout
作用:定義向用戶顯示最終的經格式化的輸出信息。
注意:一個Appender對象僅能對應一個Layout對象
內容的Layout組件:
PatternLayout ,用戶自定義格式,內置參數如下
%m(message),輸出的日志消息%n(newline),換行%d(datetime),輸出當前語句運行的時刻%r(runtime),輸出程序從運行到當前語句時消耗的毫秒數%t(thread id),輸出當前語句運行的線程ID%p(level),輸出日志級別(日志事件)%c(class),輸出當前語句所在的對象名稱%M(method),輸出當前語句所在的方法名稱%f(file),輸出當前語句所在的文件名稱%L(line),輸出當前語句位於所在的文件中的行號%l(location),輸出當前語句位於的全限定類名,以及源文件和行號%數字,表示該項的最小長度,如果不夠則在左邊用空格填充。如:%5p,表示輸出日志級別,且長度最小為5個字符%-數字,表示該項的最小長度,如果不夠則在右邊用空格填充。如:%-5p,表示輸出日志級別,且長度最小為5個字符%.數字,表示該項的最大長度,如果超出則截斷%數字.數字,表示該項的必須位於最小和最大長度之間,如果超出則截斷, 不夠則用空格填充
最佳實踐: %-d{yyyy-MM-dd HH\:mm\:ss} [%L] [%c]-[%p] %m%n
SimpleLayout
ExceptionLayout ,輸出時包含Message和Trace信息。Logger方法必須傳入Exception對象,否則什么都不輸出。XmlLayout,中文會有問題。
自定義Layout時,需要繼承 log4net.Layout.LayoutSkeleton
3. Appender Filter
作用:默認情況下Appender對象會將所有日志信息都輸出到相應的介質中,通過Appender Filter對象(命令空間:log4net.Filter)可以按照不同的標准過濾日志事件或內容。
內置的Filter組件:
DenyAllFilter ,阻止所有的日志事件被記錄
LevelMatchFilter ,只有指定等級的日志事件才被記錄
LevelRangeFilter ,日志等級在指定范圍內的事件才被記錄
LoggerMatchFilter , Logger名稱匹配才被記錄
PropertyFilter ,消息匹配指定的屬性值才被記錄
StringMatchFilter ,消息匹配指定的字符串才被記錄
4. Logger
作用:直接與應用交互的組件,用於觸發日志事件
| 級別(日志事件) | 優先級 |
| OFF | 6 |
| FATAL | 5 |
| ERROR | 4 |
| WARN | 3 |
| INFO | 2 |
| DEBUG | 1 |
| ALL | 0 |
5. Object Render
作用:輸出根據Layout格式化的日志消息。Render必須實現log4net.ObjectRender.IObjectRender接口
6. Repository
作用:負責日志對象組織結構的維護。對於非框架擴展者,幾乎不會用到該組件。
四、配置方式
1. 代碼中配置
通過 log4net.Config.BasicConfigurator.Configure 配置根日志且只能配置根日志而已。
示例 :
// 和PatternLayout一起使用FileAppender log4net.Config.BasicConfigurator.Configure( new log4net.Appender.FileAppender( new log4net.Layout.PatternLayout("%d [%t]%-5p %c [%x] - %m%n"),"testfile.log")); // using a FileAppender with an XMLLayout log4net.Config.BasicConfigurator.Configure( new log4net.Appender.FileAppender( new log4net.Layout.XMLLayout(),"testfile.xml")); // using a ConsoleAppender with a PatternLayout log4net.Config.BasicConfigurator.Configure( new log4net.Appender.ConsoleAppender( new log4net.Layout.PatternLayout("%d [%t] %-5p %c - %m%n"))); // using a ConsoleAppender with a SimpleLayout log4net.Config.BasicConfigurator.Configure( new log4net.Appender.ConsoleAppender(new log4net.Layout.SimpleLayout()));
2. 配置文件(推薦使用)
log4net框架會在 AppDomain.CurrentDomain.BaseDirectory 指向的目錄路徑下查找配置文件。
在config文件中配置
在<configuration>節點下添加<configSections>節點
<configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections>
只有添加上述節點,log4net.dll才能讀取config文件下<log4net>節點下配置信息
根日志<root>節點
框架中所有日志對象都是根日志的后代,因此日志對象若沒有顯式配置時則會使用根日志的配置信息。
<root> <!-- level節點用於定義處理哪個級別的日志事件,缺省值為DEBUG --> <level>INFO</level> <!-- appender-ref節點用於定義日志對象所使用的Appender對象 --> <appender-ref ref="appender節點的name屬性值"/> </root>
日志對象<logger>節點
顯式配置日志對象。
<!-- additivity特性設置為false時,日志對象將不繼承根日志的appender-ref節點信息。缺省值為true --> <logger name="test.Logging" additivity="false"> <!-- 覆蓋根日志的level設置 --> <level value="WARN"/> </logger>
.cs文件中的相應的調用方式
log4net.LogManager.GetLogger("test.Logging");
Appender對象<appender>節點
<appender name="appender1" type="log4net.Appender.FileAppender"> <layout type="log4net.Laytout.PatternLayout"> <conversionPattern value=".........."/> </layout> <filter type="log4net.Filter.LevelRangeFilter" levelMin="DEBUG" levelMax="WARN"> </filter> </appender>
五、關聯配置文件
每個可獨立執行的程序集均可以關聯自己的配置文件。(組件庫就使用調用者的配置文件好了)
在 AssemblyInfo.cs文件 中添加
[assembly:log4net.Config.DOMConfigurator([ConfigFile="配置文件名"|ConfigFileExtension="編譯后配置文件的擴展名"][Watch=true/false])
參數說明:
ConfigFile :指定配置文件含擴展名的路徑,如果為相對路徑則以AppDomain.CurrentDomain.BaseDirectory為當前路徑;
ConfigFileExtension :若程序編譯后配置文件使用了不同的擴展名,則通過該屬性指定,默認值為config,配置文件的最終名稱為"應用程序名.exe.config";
注意:ConfigFile和ConfigFileExtension屬性是互斥的,僅能設置其中一個
Watch :設置是否需要運行時監視文件的修改、重命名和刪除等事件,若設置為true,則使用FileSystemWatcher來監視配置文件。
六、輸出日志的優化方式
/** * 由於觸發日志事件時,會檢查日志對象的級別是否滿足日志事件的級別 * 先檢測日志對象的級別,才觸發日志事件 */ if (log.IsDebugEnabled) log.Debug("message.....");
七、總結
現在我們就不再糊里糊塗地調用log4net了,建議具體使用時再查閱API文檔!
尊重原創,轉載請注明來自: http://www.cnblogs.com/fsjohnhuang/p/3991218.html ^_^肥仔John
八、參考
http://www.cnblogs.com/jams742003/archive/2009/12/10/1620861.html
http://zhoufoxcn.blog.51cto.com/792419/429988
