一、在asp.net中使用log4net
1、添加log4net.dll引用
2、編輯配置文件,有兩種做法:放在web.config里或放在單獨的文件里,我們一般放在單獨的文件里,這樣做的好處--修改log4net的配置不會影響到整個應用重啟
3、在Global.asax的Application_Start里加入如下代碼
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~")+@"\log4net.xml"));
log4net.xml為log4net的配置文件,"\log4net.xml"為配置文件相對於站點的路徑
4、創建日志對象,一般定義為一個類的私有靜態字段
private static readonly ILog log = LogManager.GetLogger(typeof(類名).Name);
5、寫日志
if (log.IsDebugEnabled)
{
log.Debug("日志信息");
}
二、在分層構架中使用log4net
一般asp.net項目都會使用分層構架,如何在web以外的其它層使用log4net呢,比如DAL層,還要寫相應的配置文件嗎?
答案是否定的,在其它層中只要完成上面的1、4、5就行了,不需要再單獨進行配置,它會自動沿用web層里的配置信息
三、如何防止自定義的logger和root重復寫入日志
logger是從root繼承而來,默認的用logger寫的日志會被root重復寫一份,如何防止這種情況呢,網上有人提出可以去掉root里的 appender-ref,這不是一個好的解決方法,logger只是為了單獨處理一些日志,大部分的日志還是要依靠root來完成。
其實log4net提供了一種很好的解決方式,斷開logger與root的繼承關系,只要在配置文件里的logger加上屬性additivity="false" 就可以了。
在log4net的配置中,appender是最重要的部分,一般來說,每一種appender都表示一種日志的輸出介質,如日志文件、EvengLog、數據庫、控制台、郵件、ASP.NET頁面等。
本文對各種內置的appender的配置提供了示例,但卻遠稱不上詳盡。要想了解每一種appender的參數和選項的說明,請參看該appender的SDK文檔。
以下示例都是.NET 2.0下進行的, log4net的版本為1.2.10。
AdoNetAppender
詳情參考 log4net.Appender. AdoNetAppender SDK文檔 。
AdoNetAppender的相關配置內容取決於目標數據庫的provider。下面僅提供SQL Server 2000的例子。
首先建立數據表:
(
[ Id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ Date ] [ datetime ] NOT NULL ,
[ Thread ] [ varchar ] ( 255 ) NOT NULL ,
[ Level ] [ varchar ] ( 50 ) NOT NULL ,
[ Logger ] [ varchar ] ( 255 ) NOT NULL ,
[ Message ] [ varchar ] ( 4000 ) NOT NULL ,
[ Exception ] [ varchar ] ( 2000 ) NULL
)
然后添加配置:
< bufferSize value ="2" />
< connectionType value ="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" />
< connectionString value ="server=(local);database=TestBase;integrated security=false;persist security info=True;UID=sa;PWD=" />
< commandText value ="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
< parameter >
< parameterName value ="@log_date" />
< dbType value ="DateTime" />
< layout type ="log4net.Layout.RawTimeStampLayout" />
</ parameter >
< parameter >
< parameterName value ="@thread" />
< dbType value ="String" />
< size value ="255" />
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%thread" />
</ layout >
</ parameter >
< parameter >
< parameterName value ="@log_level" />
< dbType value ="String" />
< size value ="50" />
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%level" />
</ layout >
</ parameter >
< parameter >
< parameterName value ="@logger" />
< dbType value ="String" />
< size value ="255" />
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%logger" />
</ layout >
</ parameter >
< parameter >
< parameterName value ="@message" />
< dbType value ="String" />
< size value ="4000" />
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%message" />
</ layout >
</ parameter >
< parameter >
< parameterName value ="@exception" />
< dbType value ="String" />
< size value ="2000" />
< layout type ="log4net.Layout.ExceptionLayout" />
</ parameter >
</ appender >
bufferSize 表示批處理的日志事件,可以避免每次日志事件都訪問數據庫;ConnectionType 指定了要使用的IDbConnection的完全限定類型名稱;connectionString 表示連接字符串;CommandText 是SQL語句或存儲過程;最后一組parameter 節點描述了SQL語句或存儲過程需要的參數。
AspNetTraceAppender
詳情參考 log4net.Appender.AspNetTraceAppender SDK 文檔 。
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</ layout >
</ appender >
這段配置可將日志信息輸出到頁面的Trace上下文環境。如果日志的級別低於WARN,會以 System.Web.TraceContext.Write方法輸出;如果級別為WARN或WARN以上則會以 System.Web.TraceContext.Warn方法輸出,下圖中的日志信息的不同顏色可以說明這一點。 效果圖如下:
這在進行頁面調試的時候可是很方便的。
BufferingForwardingAppender
詳情參考 log4net.Appender.BufferingForwardingAppender SDK 文檔 。
< bufferSize value ="5" />
< lossy value ="true" />
< evaluator type ="log4net.Core.LevelEvaluator" >
< threshold value ="WARN" />
</ evaluator >
< appender-ref ref ="LogFileAppender" />
< appender-ref ref ="AspNetTraceAppender" />
</ appender >
BufferingForwardingAppender的主要作用是將輸出到指定類型(這里是LogFileAppender)的 Appender的日志信息進行緩存。bufferSize屬性指定了緩存的數量,如果value為5,那么將在信息量達到6條的時候,把這些日志批量輸 出。appender-ref屬性指定了緩存的Appender類型,同root節點一樣,這里可以指定多個。
ColoredConsoleAppender
詳情參考log4net.Appender.ColoredConsoleAppender SDK 文檔 。
ColoredConsoleAppender將日志信息輸出到控制台。默認情況下,日志信息被發送到控制台標准輸出流。下面這個示例演示了如何高亮顯示Error信息。
< mapping >
< level value ="ERROR" />
< foreColor value ="White" />
< backColor value ="Red, HighIntensity" />
</ mapping >
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</ layout >
</ appender >
效果如下:
還可以為不同的級別指定不同的顏色:
< mapping >
< level value ="ERROR" />
< foreColor value ="White" />
< backColor value ="Red, HighIntensity" />
</ mapping >
< mapping >
< level value ="DEBUG" />
< backColor value ="Green" />
</ mapping >
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</ layout >
</ appender >
效果如下:
ConsoleAppender
詳情參考 log4net.Appender.ConsoleAppender SDK 文檔 。
ConsoleAppender將日志信息輸出到控制台標准輸出流。
< layout type ="log4net.Layout.PatternLayout" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] - %m%n" />
</ layout >
</ appender >
EventLogAppender
詳情參考 log4net.Appender.EventLogAppender SDK 文檔 。
EventLogAppender將日志寫入本地機器的應用程序事件日志中。默認情況下,該日志的源(Source)是AppDomain.FriendlyName,也可以手動指定其它名稱。
< layout type ="log4net.Layout.PatternLayout" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] - %m%n" />
</ layout >
</ appender >
FileAppender
詳情參考 log4net.Appender.File Appender SDK 文檔 。
FileAppender將日志信息輸出到指定的日志文件。
<!-- [if gte vml 1]> <![endif]--><!-- [if !vml]-->
< param name ="File" value ="WebUtilClient.log" />
< param name ="AppendToFile" value ="true" />
< layout type ="log4net.Layout.PatternLayout" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] - %m%n" />
</ layout >
</ appender >
File指定了文件名稱,可以使用相對路徑,此時日志文件的位置取決於項目的類型(如控制台、Windows Forms、ASP.NET等);也可以使用絕對路徑;甚至可以使用環境變量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到還是覆蓋掉已有的日志文件。
還可以添加如下屬性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以允許多個進程可以寫入同一個文件。
ForwardingAppender
詳情參考 log4net.Appender.ForwardingAppender SDK 文檔 。
ForwardingAppender可以用來為一個Appender指定一組約束。看下面這個示例:
< threshold value ="WARN" />
< appender-ref ref ="ConsoleAppender" />
</ appender >
在這個示例中,為ConsoleAppender添加了約束,Threshold為WARN。這意味着對於一條日志信息,如果直接使用 ConsoleAppender,那么不論它是什么級別,總會進行輸出,而如果使用這個ForwardingAppender,則只有那些WARN或 WARN以上的日志才會發送到ConsoleAppender。
MemoryAppender
詳情參考 log4net.Appender.MemoryAppender SDK 文檔 。
似乎不應該使用配置文件來配置MemoryAppender,但如果你非要這么做,看看這個示例(未驗證):
< onlyFixPartialEventData value ="true" />
</ appender >
NetSendAppender
詳情參考 log4net.Appender.NetSendAppender SDK 文檔 。
NetSendAppender向特定用戶的屏幕發送消息(未驗證)。
< threshold value ="ERROR" />
< server value ="Anders" />
< recipient value ="xym" />
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</ layout >
</ appender >
OutputDebugStringAppender
詳情參考 log4net.Appender.OutputDebugStringAppender SDK 文檔 。
下面這個例子描述了如何配置該Appender以向OutputDebugString API寫入日志(未驗證)。
< layout type ="log4net.Layout.PatternLayout" >
< conversionPattern value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</ layout >
</ appender >
RemotingAppender
詳情參考 log4net.Appender.RemotingAppender SDK 文檔 。
RemotingAppender向特定的Sink發送日志信息(未驗證):
<!-- [if gte vml 1]><![endif]--><!-- [if !vml]-->
< sink value ="tcp://localhost:8085/LoggingSink" />
< lossy value ="false" />
< bufferSize value ="95" />
< onlyFixPartialEventData value ="true" />
</ appender >
RollingFileAppender
詳情參考 log4net.Appender.RollingFileAppender SDK 文檔 。
RollingFileAppender以FileAppender為基礎,與后者有着相同的配置選項。
下面這個例子演示了如何配置RollingFileAppender以寫入log.txt文件。寫入的文件名總是為 log.txt(StaticLogFileName參數指定為true);根據文件大小(RollingStyle)來生成新的文件;最多保存有10個 文件(MaxSizeRollBackups屬性,而且一旦寫滿10個文件,就不再寫入日志了),每個文件最大為10KB。這些文件名稱為 log.txt.1, log.txt.2…等。
< param name ="File" value ="log\Log.txt" />
< param name ="AppendToFile" value ="true" />
< param name ="MaxSizeRollBackups" value ="10" />
< param name ="MaximumFileSize" value ="5MB" />
< param name ="RollingStyle" value ="Size" />
< param name ="StaticLogFileName" value ="true" />
< layout type ="log4net.Layout.PatternLayout" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] - %m%n" />
</ layout >
</ appender >
SmtpAppender
詳情參考 log4net.Appender.SmtpAppender SDK 文檔 。
SmtpAppender通過Smtp郵件服務器發送日志信息:
< authentication value ="Basic" />
< to value ="anderscui@tom.com" />
< from value ="anderscui@163.com" />
< username value ="anderscui" />
< password value ="password" />
< subject value ="test logging message" />
< smtpHost value ="smtp.163.com" />
< bufferSize value ="512" />
< lossy value ="true" />