使用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能夠很簡單的為我們的程序添加日志記錄功能。下面我們先通過一個(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] 日志級別:%-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ù)庫中,這里舉例輸出到Access數(shù)據(jù)庫中,數(shù)據(jù)庫為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ì)了。
第四步,
在程序中記錄信息。我們在項(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] 日志級別:INFO? 出錯(cuò)類:LogFileAppender property:[(null)] - 錯(cuò)誤描述:Default.aspx下面的PageLoad方法被執(zhí)行
通過上面這幾步我想您已經(jīng)能夠?yàn)槌绦騽?chuàng)建一些簡單日志記錄功能了。下面我們再來詳細(xì)說說log4net其他的一些使用方法與特點(diǎn)。
log4net詳細(xì)說明
這里我通過問答的形式來說明log4net的一些應(yīng)用。
1.log4net總共有幾種記錄方式,每種方式該如何配置與使用?
Log4net目前支持的輸出方式包括:
- 1 AdoNetAppender
將日志記錄到數(shù)據(jù)庫中。可以采用SQL和存儲(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.這些日志信息將在用戶終端的對話框中顯示。 - 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ù)庫方式:
首先,添加數(shù)據(jù)庫記錄appender
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<!--數(shù)據(jù)庫連接字符串-->
<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ù)庫,并在代碼中啟用數(shù)據(jù)庫記錄方式:
//獲得log4net實(shí)例
ILog log = log4net.LogManager.GetLogger("AdoNetAppender_Access");
log.Debug("Default.aspx下面的PageLoad方法被執(zhí)行");
這樣日志就被記錄到數(shù)據(jù)庫中了。
2.log4net如何過濾我想要的日志信息,比如一個(gè)日志中只記錄程序錯(cuò)誤日志?
這個(gè)需求可以通過配置filter來實(shí)現(xiàn)。具體操作如下:
全局方式:
這種方式會(huì)將級別應(yīng)用于所有的日志輸入方式。具體操作為在root節(jié)點(diǎn)下添加:
<!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會(huì)被記錄
-->
<!--如果沒有定義LEVEL的值,則缺省為DEBUG-->
<level value="ERROR" />
這樣對于所有的日志記錄方式,所有地域ERROR級別的都不會(huì)被記錄了。
單獨(dú)配置級別方式:
該方式不會(huì)影響其他的日志輸入方式。方法如下為,在具體的appender下添加filter:
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="Fatal" />
</filter>
這種方式可以配置記錄級別的方位,如果只需要記錄一種,則最大和最小設(shè)置一樣就行了。
3.你上面的日志輸出格式我不喜歡,如何在log4net中配置我想要的日志輸出格式?
log4net的輸入格式定義在每個(gè)appender的layout中。具體的有以下內(nèi)置可選項(xiàng):
%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息?
%n(new line):換行?
%d(datetime):輸出當(dāng)前語句運(yùn)行的時(shí)刻?
%r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語句時(shí)消耗的毫秒數(shù)?
%t(thread id):當(dāng)前語句所在的線程ID?
%p(priority): 日志的當(dāng)前優(yōu)先級別,即DEBUG、INFO、WARN…等?
%c(class):當(dāng)前日志對象的名稱,例如:?
%f(file):輸出語句所在的文件名。?
%l(line):輸出語句所在的行號。?
%數(shù)字:表示該項(xiàng)的最小長度,如果不夠,則用空格填充,如“%-5level”表示level的最小寬度是5個(gè)字符,如果實(shí)際長度不夠5個(gè)字符則以空格填充。
通過這些東西,你可以任意組合你喜歡的輸出格式內(nèi)容。
4.有沒有方式控制程序自動(dòng)按日期記錄日志信息,即每天的日志都在不同的日志文件中?
其實(shí)這種方式對應(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ù)庫的開始結(jié)束處.
- Ⅳ.除非必要,不要在循環(huán)體中加入日志,否則一旦出問題可能導(dǎo)致日志暴增.
- Ⅴ.在自己認(rèn)為很重要的邏輯處寫入日志.
到此這篇關(guān)于使用Log4net進(jìn)行日志記錄的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity圖形學(xué)之ShaderLab入門基礎(chǔ)
Unity中所有Shader文件都通過一種陳述性語言進(jìn)行描述,稱為“ShaderLab”, 這篇文章主要介紹了Unity圖形學(xué)之ShaderLab入門基礎(chǔ),需要的朋友可以參考下2022-01-01
C# 設(shè)置防火墻的創(chuàng)建規(guī)則
這篇文章主要介紹了C# 設(shè)置防火墻的創(chuàng)建規(guī)則,幫助大家更好的利用c#操作防火墻,感興趣的朋友可以了解下2020-11-11
C#遍歷文件夾及其子目錄的完整實(shí)現(xiàn)方法
這篇文章主要介紹了C#遍歷文件夾及其子目錄的方法,涉及C#文件與目錄的基本操作技巧,簡單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
Unity 百度AI實(shí)現(xiàn)人像動(dòng)漫化效果
這篇文章主要介紹了Unity如何接入百度AI接口, 運(yùn)用對抗生成網(wǎng)絡(luò)技術(shù),為用戶量身定制千人千面的二次元?jiǎng)勇蜗?,并支持通過參數(shù)設(shè)置,生成二次元?jiǎng)勇讼瘛8信d趣的可以學(xué)習(xí)一下2022-01-01

