記錄日志框架:log4net使用


一、log4net簡介

Log4net是Apache下一個開放源碼的項目,我們可以控制日志信息的輸出目的地。
Log4net中定義了多種日志信息輸出模式。
在做項目的時候最頭疼的是在程序發布到正式環境之后出現了問題,我們不能調試而且問題很難找到,於是我們需要大量的日志數據來精確的跟蹤程序的運行狀態。
Log4net可以幫我們來解決這一個難題,對於日志的輸出我們不需要人為的去干涉,它可以根據需要將日志輸出到控制台、文本文件、Windows日志事件查看器、數據庫、郵件等位置,以便我們快速跟蹤程序bug。

二、log4net結構
log4net主要分為5個核心組件:Logger、APPender、Filter、Layout、Object Render。

1、Logger:
   主要用於記錄日志的分類和控制日志的級別。它可以以多種格式輸出日志信息,同時它也可以控制日志的輸出級別。
2、APPender:
   這里我們簡單稱之為“附着器”,意思就是說日志的輸出必須依賴於它,更確切的說以文本形式輸出,還是控制台格式輸出都必須要依靠它來控制。log4net定義了多種附着器:
(1)AdoNetAppender:將日志記錄到數據庫中,可以采用SQL和存儲過程兩種方式。
(2)FileAppender:將日志寫到文件中。
(3)MemoryAppender:將日志存到內存緩沖區。
(4)ConsoleAppender:將日志輸出到控制台。
(5)EventLogAppender:將日志寫到Windows Event Log中。
(6)ANSIColorTerminalAppender:在ANSI窗口終端寫下高亮度的日志事件。
(7)ASPNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
(8)BufferingForwardingAppender:在輸出到Appenders之前先緩存日志事件。
(9)RollingFileAppender:將日志以回滾文件的形式寫到文件中。
(10)SmtpAppender:將日志寫到郵件中。
3、Filter:
  Appender是將日志以缺省值的方式輸出,意思就是按照默認值的方式輸出。而Filter意思是過濾器,使用Filter可以將日志以不同的格式來輸出。
4、Layout:
  這個用於控制日志輸出顯示格式。
5、Object Render
  用於按照用戶自定義標准來輸出日志。

三、Log4net參數:針對Layout設置日志輸出的格式
1.%m(message):輸出的日志消息
2.%n(new line):換行
3.%d(datetime):輸出當前語句運行的時刻
4.%r(runtime):輸出程序從運行到當前語句時消耗的毫秒數
5.%t(thread id):當前語句所在線程的ID
6.%p(priority):日志的當前優先級
7.%c(Class):當前日志對象的名稱
8.%f(file):輸出語句所在的文件名
9.%l(line):輸出語句所在的行號
10.%數字:表示該項的最小寬度,如果不夠,則用空格填充。

例如:"[時間]:%d%n[級別]:%p%n[內容]:%m%n%n"
[時間]:2016-10-28 10:21:38,634
[級別]:INFO
[內容]:>>>>>>>>>>>

四、Log4net日志分類

Log4net 分為如下幾個級別:
FATAL 毀滅級別
ERROR 錯誤級別
WARA  警告級別
INFO  消息級別
DEBUG 調試級別
這幾種日志級別高低:FATAL>ERROR>WARA>INFO>DEBUG。
只有日志輸出級別大於或等於配置的級別才能輸出日志信息。
比如我的日志配置級別為INFO,那么只有log.info(),log.warm(),log.Error(),log.Fatal()才能輸出日志信息,Debug方式就不能輸出。
Log4net中還有兩種特殊的配置級別:ALL -允許所有的日志級別輸出,OFF - 拒絕所有的日志級別輸出。

五、在配置中啟用和關閉日志
在config文件中可以很方便地關閉和啟用日志,就是在<root>進行配置,如下就是一個例子:

 1 <root>
 2       <!--設置日志輸出級別-->
 3       <level value="INFO"></level>
 4       <!--以文件的形式記錄日志-->
 5       <appender-ref ref="RollingLogFileAppender"></appender-ref>
 6       <!--以控制台的形式記錄日志-->
 7       <appender-ref ref="ConsoleAppender"></appender-ref>
 8       <!--以數據庫的形式記錄日志-->
 9       <appender-ref ref="AdoNetAppender"></appender-ref>
10 </root>

在上面的例子中可以看出,如果想增加日志輸出目的地,增加<appender-ref>節點就是了,注意后面的ref是在config中配置的appender name,如果想要取消,刪除或者注釋掉這行就可以了。

六、log4net使用

1、引用log4net.dll文件

使用log4net必須引入log4net.dll文件,兩種下載log4net.dll的方式:

(1)、在Nuget中下載log4net

點擊"安裝"進行安裝

(2)、在官網下載

官網網址:http://logging.apache.org/log4net/

下載DLL文件,解壓之后根據.NET FRAMEWORK的版本,選擇對應的DLL文件,文件路徑:C:\Users\Lenovo\Desktop\log4net-2.0.7-bin-newkey\log4net-2.0.7\bin\net\4.5\release。

引用->添加引用,將下載的log4net.dll文件添加進來。

2、在config文件中的配置

首先要添加config文件,在類庫項目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。或者新添加一個"應用程序配置文件",將配置信息添加在新的配置文件中,在本示例中,將配置信息添加在新的應用程序配置文件中。新的配置文件命名為:log4net.config。

注意:要將log4net.config的屬性“復制到輸出目錄”設置為“始終復制”。在log4net上右鍵選擇文件屬性,修改屬性

要使用log4net,首先要在config文件的<configSections>節點中增加配置(如果沒有這個節點請手動增加),如下:

1 <configSections>
2     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
3 </configSections>

 

除此之外,還要在頂級節點<configuration>下增加<log4net>子節點。在<log4net>節點下就可以增加<appender>子節點,每個<appender>子節點代表一種記錄日志的方式。

在使用日志的類的命名空間前加上XmlConfiguratorAttribute標記

不加這個標記的話則log無法生效,如果類較多則比較麻煩,此時可以把這個配置放在AssemblyInfo.cs中,針對整個程序集生效。

(3)、示例程序

配置文件:

  1 <?xml version="1.0" encoding="utf-8" ?>
  2 <configuration>
  3 
  4   <configSections>
  5     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  6   </configSections>
  7   <log4net>
  8     <!--把日志信息輸出到文件里-->
  9     <!-- 日志文件部分log輸出格式的設定 -->
 10     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
 11       <!--日志文件名開頭-->
 12       <file value="Logs/Log_"/>
 13       <!--多線程時采用最小鎖定-->
 14       <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
 15       <!--是否追加到文件,默認為true,通常無需設置-->
 16       <appendToFile value="true"/>
 17       <!--設置動態文件名-->
 18       <StaticLogFileName value="false"/>
 19       <!--變換的形式為日期,這種情況下每天只有一個日志-->
 20       <!--此時MaxSizeRollBackups和maximumFileSize的節點設置沒有意義-->
 21       <!--<rollingStyle value="Date"/>-->
 22       <!--變換的形式為日志大小-->
 23       <!--這種情況下MaxSizeRollBackups和maximumFileSize的節點設置才有意義-->
 24       <RollingStyle value="Composite"/>
 25       <!--日期的格式 (yyyyMMdd),每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->
 26       <datePattern value="yyyy_MM_dd&quot;.log&quot;"/>
 27       <!--每天記錄的日志文件個數,與maximumFileSize配合使用-->
 28       <MaxSizeRollBackups value="100"/>
 29       <!--每個日志文件的最大大小;可用的單位:KB|MB|GB;不要使用小數,否則會一直寫入當前日志-->
 30       <maximumFileSize value="8MB"/>
 31       <!--日志格式-->
 32       <layout type="log4net.Layout.PatternLayout">
 33         <header value="------------------------------------------------------------"/>
 34         <ConversionPattern value="★★★★★★%newline%date [%thread] %-5level %logger [%ndc] - %newline%message%newline" />
 35       </layout>
 36     </appender>
 37     <!--記錄日志到數據庫-->
 38     <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
 39       <!--緩存:當日志達到一定的數量,在往數據庫里面保存,減少數據庫壓力-->
 40       <bufferSize value="1"/>
 41       <!--引用的動態鏈接庫-->
 42       <connectionType value="System.Data.SqlClient.SqlConnection,System.Data,Version=1.0.3300.0,Culture=neutral,PublicKeyToKen=b77a5c561934e089"/>
 43       <!--數據庫連接字符串-->
 44       <connectionString value="Data Source=JIANGXIAOLIANG;Initial Catalog=NightCat;Integrated Security=True"/>
 45       <!--插入數據庫表的SQL語句-->
 46       <commandText value="INSERT INTO [dbo].[Sys_Log]([Date],[Thread] ,[Leval],[Logger],[Message],[Exception]) VALUES (@Date ,@Thread,@Leval ,@Logger ,@Message,@Exception)"/>
 47       <!--參數-->
 48       <parameter>
 49         <parameterName value="@Date"/>
 50         <dbType value="DateTime"/>
 51         <layout type="log4net.Layout.RawTimeStampLayout"/>
 52       </parameter>
 53       <parameter>
 54         <parameterName value="@Thread"/>
 55         <dbType value="String"/>
 56         <size value="255"></size>
 57         <layout type="log4net.Layout.PatternLayout">
 58           <conversionPattern value="%thread"/>
 59         </layout>
 60       </parameter>
 61       <parameter>
 62         <parameterName value="@Leval"/>
 63         <dbType value="String"/>
 64         <size value="255"></size>
 65         <layout type="log4net.Layout.PatternLayout">
 66           <conversionPattern value="%leval"/>
 67         </layout>
 68       </parameter>
 69       <parameter>
 70         <parameterName value="@Logger"/>
 71         <dbType value="String"/>
 72         <size value="255"></size>
 73         <layout type="log4net.Layout.PatternLayout">
 74           <conversionPattern value="%thread"/>
 75         </layout>
 76       </parameter>
 77       <parameter>
 78         <parameterName value="@Message"/>
 79         <dbType value="String"/>
 80         <size value="255"></size>
 81         <layout type="log4net.Layout.PatternLayout">
 82           <conversionPattern value="%thread"/>
 83         </layout>
 84       </parameter>
 85       <parameter>
 86         <parameterName value="@Exception"/>
 87         <dbType value="String"/>
 88         <size value="255"></size>
 89         <layout type="log4net.Layout.ExceptionLayout"/>
 90       </parameter>
 91     </appender>
 92     <!--把日志信息輸出到控制台-->
 93     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
 94       <!--日志在日志文件中的布局格式-->
 95       <layout type="log4net.Layout.PatternLayout">
 96         <header value="------------------------------------------------------------"/>
 97         <ConversionPattern value="[時間]:%d%n[級別]:%p%n[內容]:%m%n%n" />
 98       </layout>
 99     </appender>
100     <root>
101       <!--設置日志輸出級別-->
102       <level value="INFO"></level>
103       <!--以文件的形式記錄日志-->
104       <appender-ref ref="RollingLogFileAppender"></appender-ref>
105       <!--以控制台的形式記錄日志-->
106       <appender-ref ref="ConsoleAppender"></appender-ref>
107       <!--以數據庫的形式記錄日志-->
108       <appender-ref ref="AdoNetAppender"></appender-ref>
109     </root>
110   </log4net>
111   <startup>
112     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
113   </startup>
114 </configuration>

在程序中使用log4net記錄日志:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using log4net;
 7 
 8 namespace Log4netDemo
 9 {
10     class Program
11     {        
12         static void Main(string[] args)
13         {
14             //創建文件對象
15             ILog log = LogManager.GetLogger("log4netDemo");
16             //開啟配置
17             log4net.Config.XmlConfigurator.Configure();
18             log.Debug("我是Debug");
19             log.Info("我是Info");
20             log.Error("我是Error");
21 
22             Console.ReadKey();
23         }
24     }
25 }

輸出結果(以控制台為例):

在config文件中設置的日志輸出級別是INFO,而Debug的級別小於INFO,所以只輸出Info和Error。

在WebForm中也可以使用Log4net,如果是web項目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM