.net項(xiàng)目使用日志框架log4net
一、log4net簡(jiǎn)介
Log4net是Apache下一個(gè)開(kāi)放源碼的項(xiàng)目,我們可以控制日志信息的輸出目的地。
Log4net中定義了多種日志信息輸出模式。
在做項(xiàng)目的時(shí)候最頭疼的是在程序發(fā)布到正式環(huán)境之后出現(xiàn)了問(wèn)題,我們不能調(diào)試而且問(wèn)題很難找到,于是我們需要大量的日志數(shù)據(jù)來(lái)精確的跟蹤程序的運(yùn)行狀態(tài)。
Log4net可以幫我們來(lái)解決這一個(gè)難題,對(duì)于日志的輸出我們不需要人為的去干涉,它可以根據(jù)需要將日志輸出到控制臺(tái)、文本文件、Windows日志事件查看器、數(shù)據(jù)庫(kù)、郵件等位置,以便我們快速跟蹤程序bug。
二、log4net結(jié)構(gòu)
log4net主要分為5個(gè)核心組件:Logger、APPender、Filter、Layout、Object Render。
1、Logger:
主要用于記錄日志的分類(lèi)和控制日志的級(jí)別。它可以以多種格式輸出日志信息,同時(shí)它也可以控制日志的輸出級(jí)別。
2、APPender:
這里我們簡(jiǎn)單稱(chēng)之為“附著器”,意思就是說(shuō)日志的輸出必須依賴(lài)于它,更確切的說(shuō)以文本形式輸出,還是控制臺(tái)格式輸出都必須要依靠它來(lái)控制。log4net定義了多種附著器:
(1)AdoNetAppender:將日志記錄到數(shù)據(jù)庫(kù)中,可以采用SQL和存儲(chǔ)過(guò)程兩種方式。
(2)FileAppender:將日志寫(xiě)到文件中。
(3)MemoryAppender:將日志存到內(nèi)存緩沖區(qū)。
(4)ConsoleAppender:將日志輸出到控制臺(tái)。
(5)EventLogAppender:將日志寫(xiě)到Windows Event Log中。
(6)ANSIColorTerminalAppender:在ANSI窗口終端寫(xiě)下高亮度的日志事件。
(7)ASPNetTraceAppender:能用asp.net中Trace的方式查看記錄的日志。
(8)BufferingForwardingAppender:在輸出到Appenders之前先緩存日志事件。
(9)RollingFileAppender:將日志以回滾文件的形式寫(xiě)到文件中。
(10)SmtpAppender:將日志寫(xiě)到郵件中。
3、Filter:
Appender是將日志以缺省值的方式輸出,意思就是按照默認(rèn)值的方式輸出。而Filter意思是過(guò)濾器,使用Filter可以將日志以不同的格式來(lái)輸出。
4、Layout:
這個(gè)用于控制日志輸出顯示格式。
5、Object Render
用于按照用戶自定義標(biāo)準(zhǔn)來(lái)輸出日志。
三、Log4net參數(shù):
針對(duì)Layout設(shè)置日志輸出的格式
1.%m(message):輸出的日志消息
2.%n(new line):換行
3.%d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻
4.%r(runtime):輸出程序從運(yùn)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)
5.%t(thread id):當(dāng)前語(yǔ)句所在線程的ID
6.%p(priority):日志的當(dāng)前優(yōu)先級(jí)
7.%c(Class):當(dāng)前日志對(duì)象的名稱(chēng)
8.%f(file):輸出語(yǔ)句所在的文件名
9.%l(line):輸出語(yǔ)句所在的行號(hào)
10.%數(shù)字:表示該項(xiàng)的最小寬度,如果不夠,則用空格填充。
例如:"[時(shí)間]:%d%n[級(jí)別]:%p%n[內(nèi)容]:%m%n%n"
[時(shí)間]:2016-10-28 10:21:38,634
[級(jí)別]:INFO
[內(nèi)容]:>>>>>>>>>>>
四、Log4net日志分類(lèi)
Log4net 分為如下幾個(gè)級(jí)別:
- FATAL 毀滅級(jí)別
- ERROR 錯(cuò)誤級(jí)別
- WARA 警告級(jí)別
- INFO 消息級(jí)別
- DEBUG 調(diào)試級(jí)別
這幾種日志級(jí)別高低:FATAL>ERROR>WARA>INFO>DEBUG
。
只有日志輸出級(jí)別大于或等于配置的級(jí)別才能輸出日志信息。
比如我的日志配置級(jí)別為INFO,那么只有l(wèi)og.info(),log.warm(),log.Error(),log.Fatal()才能輸出日志信息,Debug方式就不能輸出。
Log4net中還有兩種特殊的配置級(jí)別:ALL -允許所有的日志級(jí)別輸出,OFF - 拒絕所有的日志級(jí)別輸出。
五、在配置中啟用和關(guān)閉日志
在config文件中可以很方便地關(guān)閉和啟用日志,就是在<root>進(jìn)行配置,如下就是一個(gè)例子:
<root> <!--設(shè)置日志輸出級(jí)別--> <level value="INFO"></level> <!--以文件的形式記錄日志--> <appender-ref ref="RollingLogFileAppender"></appender-ref> <!--以控制臺(tái)的形式記錄日志--> <appender-ref ref="ConsoleAppender"></appender-ref> <!--以數(shù)據(jù)庫(kù)的形式記錄日志--> <appender-ref ref="AdoNetAppender"></appender-ref> </root>
在上面的例子中可以看出,如果想增加日志輸出目的地,增加<appender-ref>節(jié)點(diǎn)就是了,注意后面的ref是在config中配置的appender name,如果想要取消,刪除或者注釋掉這行就可以了。
六、log4net使用
1、引用log4net.dll文件
使用log4net必須引入log4net.dll文件,兩種下載log4net.dll的方式:
(1)、在Nuget中下載log4net
點(diǎn)擊"安裝"進(jìn)行安裝
(2)、在官網(wǎng)下載
官網(wǎng)網(wǎng)址:http://logging.apache.org/log4net/
下載DLL文件,解壓之后根據(jù).NET FRAMEWORK的版本,選擇對(duì)應(yīng)的DLL文件,文件路徑:C:\Users\Lenovo\Desktop\log4net-2.0.7-bin-newkey\log4net-2.0.7\bin\net\4.5\release。
引用->添加引用,將下載的log4net.dll文件添加進(jìn)來(lái)。
2、在config文件中的配置
首先要添加config文件,在類(lèi)庫(kù)項(xiàng)目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config?;蛘咝绿砑右粋€(gè)"應(yīng)用程序配置文件",將配置信息添加在新的配置文件中,在本示例中,將配置信息添加在新的應(yīng)用程序配置文件中。新的配置文件命名為:log4net.config。
注意:要將log4net.config的屬性“復(fù)制到輸出目錄”設(shè)置為“始終復(fù)制”。在log4net上右鍵選擇文件屬性,修改屬性
要使用log4net,首先要在config文件的<configSections>節(jié)點(diǎn)中增加配置(如果沒(méi)有這個(gè)節(jié)點(diǎn)請(qǐng)手動(dòng)增加),如下:
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections>
除此之外,還要在頂級(jí)節(jié)點(diǎn)<configuration>下增加<log4net>子節(jié)點(diǎn)。在<log4net>節(jié)點(diǎn)下就可以增加<appender>子節(jié)點(diǎn),每個(gè)<appender>子節(jié)點(diǎn)代表一種記錄日志的方式。
在使用日志的類(lèi)的命名空間前加上XmlConfiguratorAttribute標(biāo)記
不加這個(gè)標(biāo)記的話則log無(wú)法生效,如果類(lèi)較多則比較麻煩,此時(shí)可以把這個(gè)配置放在AssemblyInfo.cs中,針對(duì)整個(gè)程序集生效。
3、示例程序
配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <!--把日志信息輸出到文件里--> <!-- 日志文件部分log輸出格式的設(shè)定 --> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件名開(kāi)頭--> <file value="Logs/Log_"/> <!--多線程時(shí)采用最小鎖定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> <!--是否追加到文件,默認(rèn)為true,通常無(wú)需設(shè)置--> <appendToFile value="true"/> <!--設(shè)置動(dòng)態(tài)文件名--> <StaticLogFileName value="false"/> <!--變換的形式為日期,這種情況下每天只有一個(gè)日志--> <!--此時(shí)MaxSizeRollBackups和maximumFileSize的節(jié)點(diǎn)設(shè)置沒(méi)有意義--> <!--<rollingStyle value="Date"/>--> <!--變換的形式為日志大小--> <!--這種情況下MaxSizeRollBackups和maximumFileSize的節(jié)點(diǎn)設(shè)置才有意義--> <RollingStyle value="Composite"/> <!--日期的格式 (yyyyMMdd),每天換一個(gè)文件記錄,如不設(shè)置則永遠(yuǎn)只記錄一天的日志,需設(shè)置--> <datePattern value="yyyy_MM_dd".log""/> <!--每天記錄的日志文件個(gè)數(shù),與maximumFileSize配合使用--> <MaxSizeRollBackups value="100"/> <!--每個(gè)日志文件的最大大小;可用的單位:KB|MB|GB;不要使用小數(shù),否則會(huì)一直寫(xiě)入當(dāng)前日志--> <maximumFileSize value="8MB"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <header value="------------------------------------------------------------"/> <ConversionPattern value="★★★★★★%newline%date [%thread] %-5level %logger [%ndc] - %newline%message%newline" /> </layout> </appender> <!--記錄日志到數(shù)據(jù)庫(kù)--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <!--緩存:當(dāng)日志達(dá)到一定的數(shù)量,在往數(shù)據(jù)庫(kù)里面保存,減少數(shù)據(jù)庫(kù)壓力--> <bufferSize value="1"/> <!--引用的動(dòng)態(tài)鏈接庫(kù)--> <connectionType value="System.Data.SqlClient.SqlConnection,System.Data,Version=1.0.3300.0,Culture=neutral,PublicKeyToKen=b77a5c561934e089"/> <!--數(shù)據(jù)庫(kù)連接字符串--> <connectionString value="Data Source=JIANGXIAOLIANG;Initial Catalog=NightCat;Integrated Security=True"/> <!--插入數(shù)據(jù)庫(kù)表的SQL語(yǔ)句--> <commandText value="INSERT INTO [dbo].[Sys_Log]([Date],[Thread] ,[Leval],[Logger],[Message],[Exception]) VALUES (@Date ,@Thread,@Leval ,@Logger ,@Message,@Exception)"/> <!--參數(shù)--> <parameter> <parameterName value="@Date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </parameter> <parameter> <parameterName value="@Thread"/> <dbType value="String"/> <size value="255"></size> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="@Leval"/> <dbType value="String"/> <size value="255"></size> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%leval"/> </layout> </parameter> <parameter> <parameterName value="@Logger"/> <dbType value="String"/> <size value="255"></size> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="@Message"/> <dbType value="String"/> <size value="255"></size> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread"/> </layout> </parameter> <parameter> <parameterName value="@Exception"/> <dbType value="String"/> <size value="255"></size> <layout type="log4net.Layout.ExceptionLayout"/> </parameter> </appender> <!--把日志信息輸出到控制臺(tái)--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <!--日志在日志文件中的布局格式--> <layout type="log4net.Layout.PatternLayout"> <header value="------------------------------------------------------------"/> <ConversionPattern value="[時(shí)間]:%d%n[級(jí)別]:%p%n[內(nèi)容]:%m%n%n" /> </layout> </appender> <root> <!--設(shè)置日志輸出級(jí)別--> <level value="INFO"></level> <!--以文件的形式記錄日志--> <appender-ref ref="RollingLogFileAppender"></appender-ref> <!--以控制臺(tái)的形式記錄日志--> <appender-ref ref="ConsoleAppender"></appender-ref> <!--以數(shù)據(jù)庫(kù)的形式記錄日志--> <appender-ref ref="AdoNetAppender"></appender-ref> </root> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
在程序中使用log4net記錄日志:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net; namespace Log4netDemo { class Program { static void Main(string[] args) { //創(chuàng)建文件對(duì)象 ILog log = LogManager.GetLogger("log4netDemo"); //開(kāi)啟配置 log4net.Config.XmlConfigurator.Configure(); log.Debug("我是Debug"); log.Info("我是Info"); log.Error("我是Error"); Console.ReadKey(); } } }
輸出結(jié)果(以控制臺(tái)為例):
在config文件中設(shè)置的日志輸出級(jí)別是INFO,而Debug的級(jí)別小于INFO,所以只輸出Info和Error。
在WebForm中也可以使用Log4net,如果是web項(xiàng)目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();
到此這篇關(guān)于.net項(xiàng)目使用日志框架log4net的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用ASP.NET實(shí)現(xiàn)簡(jiǎn)單的文字水印
用ASP.NET實(shí)現(xiàn)簡(jiǎn)單的文字水印...2006-09-09asp.net 計(jì)劃任務(wù)管理程序?qū)崿F(xiàn),多線程任務(wù)加載
b/s模式下用程序?qū)崿F(xiàn)計(jì)劃任務(wù),一直是個(gè)不太好解決和管理的問(wèn)題,當(dāng)然可以采用ajax 計(jì)時(shí)器的方法模擬form端的timer事件。2009-11-11利用.net core實(shí)現(xiàn)反向代理中間件的方法
這篇文章主要給大家介紹了關(guān)于利用.net core實(shí)現(xiàn)反向代理中間件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Visual Studio 2017下ASP.NET CORE的TagHelper智能提示解決辦法
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017下ASP.NET CORE TagHelper智能提示的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03ASP.NET拒絕訪問(wèn)臨時(shí)目錄的解決方法
這篇文章主要介紹了ASP.NET拒絕訪問(wèn)臨時(shí)目錄的解決方法,大家參考使用吧2013-11-11Asp.Net?Core配置多環(huán)境log4net配置文件的全過(guò)程
在.NET世界中有非常多的日志框架,然而log4net是目前為止最流行的一款日志框架,下面這篇文章主要給大家介紹了關(guān)于Asp.Net?Core配置多環(huán)境log4net配置文件的相關(guān)資料,需要的朋友可以參考下2022-04-04ASP.NET?Core通用主機(jī)的系統(tǒng)配置
這篇文章介紹了ASP.NET?Core通用主機(jī)系統(tǒng)配置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Asp.net Core 1.1 升級(jí)后操作mysql出錯(cuò)的解決辦法
這篇文章主要介紹了Asp.net Core 1.1 升級(jí)后操作mysql出錯(cuò)的解決辦法,需要的朋友可以參考下2016-12-12