1. 程式人生 > WINDOWS開發 >C#-log4net幫助類

C#-log4net幫助類

  一、log4net

  log4net是一個可以幫助程式設計師把日誌資訊輸出到各種 不同目標的.net類庫。它可以容易的載入到開發專案中,實現程式除錯和執行的時候的日誌資訊輸出,提供了比.net自己提供的debug類和trace 類的功能更多。log4net是從java下有卓越表現的log4j移植過來的。它是apache基金資助的專案的一部分。

  二、建立專案

  先看下結構,所用的NuGet包log4net 2.0.8,當前選中的是啟動專案,LogManager是log4net幫助類,實際應用中直接Copy專案即可。

  技術分享圖片

  程式碼相對簡單,先上程式碼,主要在配置,

技術分享圖片
 1     ///
<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 }
LogEvent.cs

  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="&#xD;&#xA;Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]--File:[%F]--Line:[%L]&#xD;&#xA;%m%n" />
29         <param name="Header" value="&#xD;&#xA;----------------------Default Program Start--------------------------&#xD;&#xA;" />
30         <param name="Footer" value="&#xD;&#xA;----------------------Default Program Stop--------------------------&#xD;&#xA;" />
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="&#xD;&#xA;Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]&#xD;&#xA;%m%n" />
46         <param name="Header" value="&#xD;&#xA;----------------------Default Program Start--------------------------&#xD;&#xA;" />
47         <param name="Footer" value="&#xD;&#xA;----------------------Default Program Stop--------------------------&#xD;&#xA;" />
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="&#xD;&#xA;Time:[%d]--Thread:[%t]--Class:[%C]--Method:[%M]--File:[%F]--Line:[%L]&#xD;&#xA;%m%n" />
70         <param name="Header" value="&#xD;&#xA;----------------------Notification Program Start--------------------------&#xD;&#xA;" />
71         <param name="Footer" value="&#xD;&#xA;----------------------Notification Program Stop--------------------------&#xD;&#xA;" />
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是過濾生成檔案的條件,當前是範圍輸出,即滿足當前範圍條件,才到此檔案中,這個範圍也就是日誌等級,

技術分享圖片