使用Log4net進(jìn)行日志記錄
首先說說為什么要進(jìn)行日志記錄。在一個(gè)完整的程序系統(tǒng)里面,日志系統(tǒng)是一個(gè)非常重要的功能組成部分。它可以記錄下系統(tǒng)所產(chǎn)生的所有行為,并按照某種規(guī)范表達(dá)出來。我們可以使用日志系統(tǒng)所記錄的信息為系統(tǒng)進(jìn)行排錯(cuò),優(yōu)化系統(tǒng)的性能,或者根據(jù)這些信息調(diào)整系統(tǒng)的行為。
Log4net是一個(gè)很著名的開源的日志記錄組件。官方網(wǎng)址為:http://logging.apache.org/log4net/ ,使用Log4net能夠很簡(jiǎn)單的為我們的程序添加日志記錄功能。下面我們先通過一個(gè)網(wǎng)站例子來說明如何在.net中使用log4net。
創(chuàng)建日志記錄步驟
第一步,
當(dāng)然是添加log4net.dll的引用啦,我這里提供一個(gè)log4net的dll文件,懶得去官網(wǎng)下的可以到這里下
http://www.dbjr.com.cn/dll/Log4net.dll.html
第二步,
在AssemblyInfo.cs文件中添加下面一句話:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
這句話的意思是log4net會(huì)自動(dòng)尋找配置文件App.config或Web.config從而獲得并加載其中的配置信息。如果想log4net隨時(shí)監(jiān)視配置文件以便重新加載的話就要這樣寫按照上面一樣寫(winform程序ConfigFile為App.config)。
第三步,
配置Web.config。
<configuration> <configSections> <!--注意:這里需要添加--> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings> <!--注意:這里需要添加--> <log4net> <!--定義輸出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定義文件存放位置--> <file value="C:\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd-HH:mm:ss" /> <layout type="log4net.Layout.PatternLayout"> <!--輸出格式--> <!--樣例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="記錄時(shí)間:%date 線程ID:[%thread] 日志級(jí)別:%-5level 出錯(cuò)類:%logger property:[%property{NDC}] - 錯(cuò)誤描述:%message%newline" /> </layout> </appender> <!--定義輸出到控制臺(tái)命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定義輸出到windows事件中--> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定義輸出到數(shù)據(jù)庫(kù)中,這里舉例輸出到Access數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)為C盤的log4net.mdb--> <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定義各個(gè)參數(shù)--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <!--定義日志的輸出媒介,下面定義日志以四種方式輸出。也可以下面的按照一種類型或其他類型輸出。--> <root> <!--文件形式記錄日志--> <appender-ref ref="LogFileAppender" /> <!--控制臺(tái)控制顯示日志--> <appender-ref ref="ConsoleAppender" /> <!--Windows事件日志--> <!--<appender-ref ref="EventLogAppender" />--> <!-- 如果不啟用相應(yīng)的日志記錄,可以通過這種方式注釋掉 <appender-ref ref="AdoNetAppender_Access" /> --> </root> </log4net> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpModules> <add name="fileUpload" type="WebApplication3.ProcessFileModule"/> </httpModules> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> <httpRuntime maxRequestLength="10240000"/> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
上面這段配置取自周公,配置的說明上面已經(jīng)注釋的比較詳細(xì)了。
第四步,
在程序中記錄信息。我們?cè)陧?xiàng)目下Default.aspx的Page_Load方法加入如下代碼:
//獲得log4net實(shí)例 ILog log = log4net.LogManager.GetLogger("LogFileAppender"); log.Info("Default.aspx下面的PageLoad方法被執(zhí)行");
然后運(yùn)行項(xiàng)目,可以發(fā)現(xiàn)在c:\log4netfile.txt中已經(jīng)記錄了一條日志信息:
記錄時(shí)間:2011-04-21 21:26:17,729 線程ID:[4] 日志級(jí)別:INFO? 出錯(cuò)類:LogFileAppender property:[(null)] - 錯(cuò)誤描述:Default.aspx下面的PageLoad方法被執(zhí)行
通過上面這幾步我想您已經(jīng)能夠?yàn)槌绦騽?chuàng)建一些簡(jiǎn)單日志記錄功能了。下面我們?cè)賮碓敿?xì)說說log4net其他的一些使用方法與特點(diǎn)。
log4net詳細(xì)說明
這里我通過問答的形式來說明log4net的一些應(yīng)用。
1.log4net總共有幾種記錄方式,每種方式該如何配置與使用?
Log4net目前支持的輸出方式包括:
- 1 AdoNetAppender
將日志記錄到數(shù)據(jù)庫(kù)中??梢圆捎肧QL和存儲(chǔ)過程兩種方式。 - 2 AnsiColorTerminalAppender
在ANSI 窗口終端寫下高亮度的日志事件。 - 3 AspNetTraceAppender
能用asp.net中Trace的方式查看記錄的日志。 - 4 BufferingForwardingAppender
在輸出到子Appenders之前先緩存日志事件。 - 5 ConsoleAppender
將日志輸出到控制臺(tái)。 - 6 EventLogAppender
將日志寫到Windows Event Log. - 7 FileAppender
將日志寫到文件中。 - 8 LocalSyslogAppender
將日志寫到local syslog service (僅用于UNIX環(huán)境下). - 9 MemoryAppender
將日志存到內(nèi)存緩沖區(qū)。 - 10 NetSendAppender
將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對(duì)話框中顯示。 - 11 RemoteSyslogAppender
通過UDP網(wǎng)絡(luò)協(xié)議將日志寫到Remote syslog service。 - 12 RemotingAppender
通過.NET Remoting將日志寫到遠(yuǎn)程接收端。 - 13 RollingFileAppender
將日志以回滾文件的形式寫到文件中。 - 14 SmtpAppender
將日志寫到郵件中。 - 15 TraceAppender
將日志寫到.NET trace 系統(tǒng)。 - 16 UdpAppender
將日志connectionless UDP datagrams的形式送到遠(yuǎn)程宿主或以UdpClient的形式廣播。
可以看到目前支持的方式還是很多的,我這里調(diào)幾個(gè)認(rèn)為常用的做個(gè)例子。
1.文件的方式我們上面已經(jīng)講過了,這里不再做例子了。
2.數(shù)據(jù)庫(kù)方式:
首先,添加數(shù)據(jù)庫(kù)記錄appender
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <!--數(shù)據(jù)庫(kù)連接字符串--> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定義各個(gè)參數(shù)--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender>
然后建立c:log4net.mdb 數(shù)據(jù)庫(kù),并在代碼中啟用數(shù)據(jù)庫(kù)記錄方式:
//獲得log4net實(shí)例 ILog log = log4net.LogManager.GetLogger("AdoNetAppender_Access"); log.Debug("Default.aspx下面的PageLoad方法被執(zhí)行");
這樣日志就被記錄到數(shù)據(jù)庫(kù)中了。
2.log4net如何過濾我想要的日志信息,比如一個(gè)日志中只記錄程序錯(cuò)誤日志?
這個(gè)需求可以通過配置filter來實(shí)現(xiàn)。具體操作如下:
全局方式:
這種方式會(huì)將級(jí)別應(yīng)用于所有的日志輸入方式。具體操作為在root節(jié)點(diǎn)下添加:
<!--控制級(jí)別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 比如定義級(jí)別為INFO,則INFO級(jí)別向下的級(jí)別,比如DEBUG日志將不會(huì)被記錄 --> <!--如果沒有定義LEVEL的值,則缺省為DEBUG--> <level value="ERROR" />
這樣對(duì)于所有的日志記錄方式,所有地域ERROR級(jí)別的都不會(huì)被記錄了。
單獨(dú)配置級(jí)別方式:
該方式不會(huì)影響其他的日志輸入方式。方法如下為,在具體的appender下添加filter:
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="Fatal" /> </filter>
這種方式可以配置記錄級(jí)別的方位,如果只需要記錄一種,則最大和最小設(shè)置一樣就行了。
3.你上面的日志輸出格式我不喜歡,如何在log4net中配置我想要的日志輸出格式?
log4net的輸入格式定義在每個(gè)appender的layout中。具體的有以下內(nèi)置可選項(xiàng):
%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息?
%n(new line):換行?
%d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻?
%r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)?
%t(thread id):當(dāng)前語(yǔ)句所在的線程ID?
%p(priority): 日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等?
%c(class):當(dāng)前日志對(duì)象的名稱,例如:?
%f(file):輸出語(yǔ)句所在的文件名。?
%l(line):輸出語(yǔ)句所在的行號(hào)。?
%數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充,如“%-5level”表示level的最小寬度是5個(gè)字符,如果實(shí)際長(zhǎng)度不夠5個(gè)字符則以空格填充。
通過這些東西,你可以任意組合你喜歡的輸出格式內(nèi)容。
4.有沒有方式控制程序自動(dòng)按日期記錄日志信息,即每天的日志都在不同的日志文件中?
其實(shí)這種方式對(duì)應(yīng)于一種特定的記錄方式:RollingFileAppender。這種方式也是基于文件記錄的,不過他提供更加靈活的日志記錄方式。具體說來他可以按日志文件的大小或者日志記錄的時(shí)間進(jìn)行自動(dòng)變換日志文件。
按每天不同的日期進(jìn)行記錄分類:
<appender name="RollingLogFileAppenderEveryMin" type="log4net.Appender.RollingFileAppender"> <!--日志文件名開頭--> <file value="c:\logfile.txt" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--變換的形式為日期--> <rollingStyle value="Date" /> <!--日期的格式,每分鐘換一個(gè)文件記錄--> <datePattern value="yyyyMMdd-HHmm" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
按照日志文件的大小進(jìn)行變換,通過這種方式可以有效降低日志文件體積膨脹的問題:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件名--> <file value="c:\log.txt"/> <!--是否在文件中追加--> <appendToFile value="true"/> <!--按照文件的大小進(jìn)行變換日志文件--> <rollingStyle value="Size"/> <!--最大變換數(shù)量,如果超過這個(gè)數(shù)量則從第一個(gè)文件開始復(fù)寫--> <maxSizeRollBackups value="10"/> <!--最大文件大小,支持KB,MB,GB--> <maximumFileSize value="100KB"/> <!--日志文件名是否為靜態(tài)--> <staticLogFileName value="true"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> </layout> </appender>
最后從網(wǎng)上找了一段寫日志的原則,感覺還是很好的:
【寫日志的原則】
- Ⅰ.在catch后,把異常寫入日志.
- Ⅱ.在調(diào)用第三方控件的開始和結(jié)束處.
- Ⅲ.在連接數(shù)據(jù)庫(kù)的開始結(jié)束處.
- Ⅳ.除非必要,不要在循環(huán)體中加入日志,否則一旦出問題可能導(dǎo)致日志暴增.
- Ⅴ.在自己認(rèn)為很重要的邏輯處寫入日志.
到此這篇關(guān)于使用Log4net進(jìn)行日志記錄的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity圖形學(xué)之ShaderLab入門基礎(chǔ)
Unity中所有Shader文件都通過一種陳述性語(yǔ)言進(jìn)行描述,稱為“ShaderLab”, 這篇文章主要介紹了Unity圖形學(xué)之ShaderLab入門基礎(chǔ),需要的朋友可以參考下2022-01-01C# 設(shè)置防火墻的創(chuàng)建規(guī)則
這篇文章主要介紹了C# 設(shè)置防火墻的創(chuàng)建規(guī)則,幫助大家更好的利用c#操作防火墻,感興趣的朋友可以了解下2020-11-11unity實(shí)現(xiàn)場(chǎng)景跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)場(chǎng)景跳轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法
這篇文章主要介紹了C#遍歷文件夾及其子目錄的方法,涉及C#文件與目錄的基本操作技巧,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Unity 百度AI實(shí)現(xiàn)人像動(dòng)漫化效果
這篇文章主要介紹了Unity如何接入百度AI接口, 運(yùn)用對(duì)抗生成網(wǎng)絡(luò)技術(shù),為用戶量身定制千人千面的二次元?jiǎng)勇蜗螅⒅С滞ㄟ^參數(shù)設(shè)置,生成二次元?jiǎng)勇讼?。感興趣的可以學(xué)習(xí)一下2022-01-01