C#-log4net幫助類
一、log4net
log4net是一個可以幫助程式設計師把日誌資訊輸出到各種 不同目標的.net類庫。它可以容易的載入到開發專案中,實現程式除錯和執行的時候的日誌資訊輸出,提供了比.net自己提供的debug類和trace 類的功能更多。log4net是從java下有卓越表現的log4j移植過來的。它是apache基金資助的專案的一部分。
二、建立專案
先看下結構,所用的NuGet包log4net 2.0.8,當前選中的是啟動專案,LogManager是log4net幫助類,實際應用中直接Copy專案即可。
程式碼相對簡單,先上程式碼,主要在配置,
1 ///LogEvent.cs<summary> 2 /// 寫日誌類 3 /// </summary> 4 public class LogEvent 5 { 6 /// <summary> 7 /// 預設日誌物件 8 /// </summary> 9 public static ILog Loger 10 { 11 get 12 { 13 return GetLoger("Default"); 14} 15 } 16 17 /// <summary> 18 /// 通知日誌 19 /// </summary> 20 public static ILog LogInfo 21 { 22 get 23 { 24 return GetLoger("LogInfo"); 25 } 26 } 27 28 /// <summary> 29/// 獲取日誌物件 30 /// </summary> 31 /// <param name="logerName">日誌名稱</param> 32 /// <returns></returns> 33 public static ILog GetLoger(string logerName) 34 { 35 return log4net.LogManager.GetLogger(logerName); 36 } 37 38 }
log4net.config配置檔案,裡面包括寫日誌的位置好多資訊。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 5 </configSections> 6 7 <log4net> 8 9 <!--<root> 10 <level value="ALL" /> 11 <appender-ref ref="InfoLog" /> 12 <appender-ref ref="ErrorLog"/> 13 </root>--> 14 15 <logger name="Default"> 16 <level value="ALL" /> 17 <appender-ref ref="InfoLog" /> 18 <appender-ref ref="ErrorLog"/> 19 </logger> 20 <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender,log4net" > 21 <param name="File" value="log\DefaultError.log" /> 22 <param name="AppendToFile" value="true" /> 23 <param name="MaxSizeRollBackups" value="10" /> 24 <param name="MaximumFileSize" value="10MB" /> 25 <param name="RollingStyle" value="Size" /> 26 <param name="StaticLogFileName" value="true" /> 27 <layout type="log4net.Layout.PatternLayout,log4net"> 28 <param name="ConversionPattern" value="
Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]--File:[%F]--Line:[%L]
%m%n" /> 29 <param name="Header" value="
----------------------Default Program Start--------------------------
" /> 30 <param name="Footer" value="
----------------------Default Program Stop--------------------------
" /> 31 </layout> 32 <filter type="log4net.Filter.LevelRangeFilter"> 33 <param name="LevelMin" value="ERROR" /> 34 <param name="LevelMax" value="OFF" /> 35 </filter> 36 </appender> 37 <appender name="InfoLog" type="log4net.Appender.RollingFileAppender,log4net" > 38 <param name="File" value="log\DefaultInfo.log" /> 39 <param name="AppendToFile" value="true" /> 40 <param name="MaxSizeRollBackups" value="10" /> 41 <param name="MaximumFileSize" value="10MB" /> 42 <param name="RollingStyle" value="Size" /> 43 <param name="StaticLogFileName" value="true" /> 44 <layout type="log4net.Layout.PatternLayout,log4net"> 45 <param name="ConversionPattern" value="
Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]
%m%n" /> 46 <param name="Header" value="
----------------------Default Program Start--------------------------
" /> 47 <param name="Footer" value="
----------------------Default Program Stop--------------------------
" /> 48 </layout> 49 <filter type="log4net.Filter.LevelRangeFilter"> 50 <param name="LevelMin" value="ALL" /> 51 <param name="LevelMax" value="WARN" /> 52 </filter> 53 </appender> 54 55 56 <logger name="LogInfo"> 57 <level value="ALL" /> 58 <appender-ref ref="LogInfoAppender" /> 59 </logger> 60 <appender name="LogInfoAppender" type="log4net.Appender.RollingFileAppender,log4net" > 61 <param name="File" value="log\Log.log" /> 62 <param name="AppendToFile" value="true" /> 63 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 64 <param name="MaxSizeRollBackups" value="10" /> 65 <param name="MaximumFileSize" value="5MB" /> 66 <param name="RollingStyle" value="Size" /> 67 <param name="StaticLogFileName" value="true" /> 68 <layout type="log4net.Layout.PatternLayout,log4net"> 69 <param name="ConversionPattern" value="
Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]--File:[%F]--Line:[%L]
%m%n" /> 70 <param name="Header" value="
----------------------Notification Program Start--------------------------
" /> 71 <param name="Footer" value="
----------------------Notification Program Stop--------------------------
" /> 72 </layout> 73 <filter type="log4net.Filter.LevelRangeFilter"> 74 <param name="LevelMin" value="ALL" /> 75 <param name="LevelMax" value="OFF" /> 76 </filter> 77 </appender> 78 </log4net> 79 80 </configuration>log4net.config
執行寫日誌程式碼,
1 for(int i = 0; i < 100; i++) 2 { 3 LogEvent.Loger.Debug("Debug..................Debug............................Debug.........................."); 4 LogEvent.Loger.DebugFormat("Debug..................Debug............................Debug..........................{0}",i); 5 LogEvent.Loger.Info("Info.....................Info............................Info..........................."); 6 LogEvent.Loger.InfoFormat("Info.....................Info............................Info...........................{0}",i); 7 LogEvent.Loger.Error("Error....................Error.............................Error......................."); 8 LogEvent.Loger.ErrorFormat("Error....................Error.............................Error.......................{0}",i); 9 LogEvent.Loger.Fatal("Fatal....................Fatal.............................Fatal......................."); 10 LogEvent.Loger.FatalFormat("Fatal....................Fatal.............................Fatal.......................{0}",i); 11 12 13 LogEvent.LogInfo.Debug("Debug..................Debug............................Debug.........................."); 14 LogEvent.LogInfo.DebugFormat("Debug..................Debug............................Debug..........................{0}",i); 15 LogEvent.LogInfo.Info("Info.....................Info............................Info..........................."); 16 LogEvent.LogInfo.InfoFormat("Info.....................Info............................Info...........................{0}",i); 17 LogEvent.LogInfo.Error("Error....................Error.............................Error......................."); 18 LogEvent.LogInfo.ErrorFormat("Error....................Error.............................Error.......................{0}",i); 19 LogEvent.LogInfo.Fatal("Fatal....................Fatal.............................Fatal......................."); 20 LogEvent.LogInfo.FatalFormat("Fatal....................Fatal.............................Fatal.......................{0}",i); 21 } 22 23 Console.ReadKey();
如果現在執行,在程式的輸出檔案中是看不到任何日誌檔案的,
需要在啟動專案的AssemblyInfo.cs中新增如下,
//日誌
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config",Watch = true)]
這是為專案註冊log4net.config配置檔案,否則的話你的配置是不能載入的,
之後再執行寫日誌,發現還是沒有輸出日誌的檔案,這是log4net.config沒有設定複製到輸出目錄,右鍵屬性,複製到輸出目錄,始終複製,
執行,會發現有輸出日誌檔案啦,
開啟日誌看下里面是不是與想象的一樣,接下來分析下log4net.config內容是怎麼配置生成日誌的規則的。
先說下剛才程式碼中的Debug、Info等日誌等級,Format是輸出格式,
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
穿插下日誌吧,
在程式中寫日誌是一件非常重要,但是很容易被開發人員忽視的地方。寫好程式的日誌可以幫助我們大大減輕後期維護壓力。在實際的工作中,開發人員往往迫於巨大時間壓力,而寫日誌又是一個非常繁瑣的事情,往往沒有引起足夠的重視。開發人員應在一開始就養成良好的日誌撰寫習慣,並且應在實際的開發工作中為寫日誌預留足夠的時間。
一般程式日誌出自下面幾個方面的需求:
1. 記錄使用者操作的審計日誌,甚至有的時候就是監管部門的要求。
2. 快速定位問題的根源
3. 追蹤程式執行的過程。
4. 追蹤資料的變化
5. 資料統計和效能分析
6. 採集執行環境資料
一般在程式上線之後,一旦發生異常,第一件事就是要弄清楚當時發生了什麼。使用者當時做了什麼操作,環境有無影響,資料有什麼變化,是不是反覆發生等,然後再進一步的確定大致是哪個方面的問題。確定是程式的問題之後再交由開發人員去重現、研究、提出解決方案。這時,日誌就給我們提供了第一手的資料。
日誌級別ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF
1. TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日誌級別,一般不會使用。TRACE一般跟蹤的是函式的呼叫,並且TRACE不應該含有變數引數,而僅能提示函式的呼叫關係。
2. DEBUG一般用於細粒度級別上,對除錯應用程式非常有幫助,主要用於開發過程中列印一些執行資訊。
3. INFO訊息在粗粒度級別上突出強調應用程式的執行過程。列印一些你感興趣的或者重要的資訊,這個可以用於生產環境中輸出程式執行的一些重要資訊,但是不能濫用,避免列印過多的日誌。
4. WARN表示會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但是也要給程式設計師一些提示。該級別表示程式會自動調整到正常的狀態,類似引數未傳入,使用了預設的引數,仍符合程式設計師預期之內的情況。
5. ERROR指出雖然發生錯誤事件,但仍然不影響系統的繼續執行。列印錯誤和異常資訊,如果不想輸出太多的日誌,可以使用這個級別。一般在WARN之後的級別在列印錯誤時,應該同時列印錯誤碼。
6. FATAL指出每個嚴重的錯誤事件將會導致應用程式的退出,這個級別比較高,重大錯誤,程式無法恢復,必須通過重啟程式來解決。
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
首先,把config檔案內容壓縮起來,如下圖,這兩個名稱就是我們在LogEvent.cs檔案中的定義的兩個方法的名稱,相當於你呼叫方法的進行了switchcase操作,找到相應的寫配置內容,其中appender後是在這個基礎上延伸出來的多個資料夾,比如,你按照日誌等級可以寫多檔案呀,DEBUG寫debug檔案,INFO寫info檔案等等。
展開其中一個logger和appender,logger裡面顯示的就是你之後追加了幾種寫日誌的方式,解釋各個param的作用:
File是日誌儲存路徑,輸出到什麼目錄,
AppendToFile是否覆寫檔案,意思就是啟動的時候如果當前資料夾存在同名檔案,若此值為true,則繼續寫到同名檔案中,若為false,就是先備份此檔案,再新建同名檔案進行寫入,
MaxSizeRollBackups,當前資料夾中,同名的檔案最大個數,比如DefaultError.log,當前檔案寫到10M,則重新命名為DefaultError.log.1,又新建一個DefaultError.log,直到到DefaultError.log.10,之後9的就會把10的覆蓋,一次這樣,資料夾中就會只有10個存在,保證磁碟空間,
MaximumFileSize,每個檔案的大小,每到10M就會新生成一個檔案,
RollingStyle,預設滾動樣式,在這裡是Size,就是大小,也就是10M,新生成一個檔案,而不是通過日期進行滾動,
StaticLogFileName,是否採用靜態檔名,就是檔案的名稱是否是靜態的,不變的,若RollingStyle為Date,就可以設定StaticLogFileName為false,根據日期來生成,這樣子你的檔名就是動態的,
layout是佈局,即寫日誌的檔案格式,內容的格式資訊,可參考官方文件,
filter是過濾生成檔案的條件,當前是範圍輸出,即滿足當前範圍條件,才到此檔案中,這個範圍也就是日誌等級,