Log4Net配置詳解
配置方式一
在相應的應用程序的配置文件中配置,(WinForm對應的是*.exe.config,WebForm對應的是*.config),本實例是Web應用程序,以Web.config為例子講解。
第一步
添加並應用Log4net.dll。然后在Web.config文件中添加下面的配置
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
</configSections>
第二步
在Web.config的Configuration節點下新增log4net節點,如下:
<log4net debug="true"> <!--RootLog實例,子Log會繼承其特性--> <root> <level value="INFO" /> <!--啟用按日期分割--> <appender-ref ref="LogFileAppenderByDate" /> <!--啟用按容量分割--> <appender-ref ref="LogFileAppenderBySize" /> <!--啟用保存到數據庫--> <appender-ref ref="AdoNetAppender" /> </root> <logger name="testApp.Logging"> <!--設置testApp.Logging日志級別為DEBUG--> <level value="DEBUG"/> </logger> <!--按日期分割日志文件 一天一個--> <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" > <!--是否續寫--> <param name="AppendToFile" value="true" /> <!--最小鎖定模型以允許多個進程可以寫入同一個文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--保存路徑--> <param name="File" value="d:\Log\\" /> <!--可以按天、小時、分鍾為Log命名--> <param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" /> <param name="StaticLogFileName" value="false" /> <param name="RollingStyle" value="Date" /> <!--最多保留的幾天的日志、這里我沒有驗證--> <param name="MaxBackupIndex" value="3" /> <!--日志輸出格式--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="時間:%d %n級別:%level %n類名:%c%n文件:%F 第%L行%n日志內容:%m%n-----------------------------------------%n%n" /> </layout> </appender> <!--按日志容量分割日志文件 10KB一個--> <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" > <!--是否續寫--> <param name="AppendToFile" value="true" /> <!--最小鎖定模型以允許多個進程可以寫入同一個文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--按照文件的大小進行變換日志文件--> <param name="RollingStyle" value="Size" /> <param name="File" value="log.txt" /> <!--單個文件最大數量 好像只有在 按Size分割時有效--> <param name="MaximumFileSize" value="200KB"/> <!--保留的log文件數量 超過此數量后 自動刪除之前的 好像只有在 按Size分割時有效--> <param name="MaxSizeRollBackups" value="2" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="發生時間:%d %n事件級別:%level %n相關類名:%c%n程序文件:%F 第%L行%n日志內容:%m%n-----------------------------------------%n%n" /> </layout> </appender> <!--記錄日志到數據庫--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <!--緩沖大小--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=DST56711\SEVEN;Initial Catalog=Log4Net;Persist Security Info=True;User ID=sa;Password=seven_123456" /> <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> </log4net>
第三步
在Web項目下找到AssemblyInfo.cs文件【Properties->AssemblyInfo.cs】加入如下代碼:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
第四步
在相應的位置寫入記錄日志的代碼:
ILog log= LogManager.GetLogger("testApp.Logging");
log.Debug("DebugMvc");
第五步
查看相應的日志記錄效果:
我們上面的root節點中配置了三個Append,分別是按日期分割寫日志到文件中【在D:\Log文件夾中】、按容量分割寫入的項目的更目錄的log.text文件中、保存到數據庫。
1、打開我的D盤Log文件夾(沒有會自動生成,生成格式按照 <param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" />格式生成)
2、在項目的根目錄生成log.txt(已經生成,就不截圖了,這兩個日志文件的內容格式是一樣的,如下:)
3、數據庫中也正常的插入了我們想要的數據
結論
看到上面的結果,不知道你是否有一些疑問,比如:
1、如果把配置寫在web.config中會讓web.config比較亂,是否可以單獨建立一個文件來配置log4net
2、我們上面提到了 在Web項目下找到AssemblyInfo.cs文件【Properties->AssemblyInfo.cs】加入如下代碼:[assembly: log4net.Config.XmlConfigurator(Watch = true)],這個是干嘛用的?
3、如果我們配置不正確,改如何調試log4net呢?(我在學習的時候是配到了,不論怎么樣也寫不到數據庫,也沒有日志信息,很是頭疼(這里也可以體現沖日志的重要性了))
如果你讀過我的前兩篇文章,你應該很容易看懂上面的配置,也自然知道Log4Net不依賴任何配置【我們不做任何配置,直接引入log4net.dll就可以】,使用配置是為了方便和更好的統一管理,所以完全可以不放在web.config中,新建一個Log4Net.config來配置。
對於AssemblyInfo.cs的作用純粹是用來初始化的,沒有任何神奇的地方,用AssemblyInfo.cs來初始化是.Net4.0新加的功能,我們完全可以放在Global.asax.cs文件中來實現。對於初始化功能,Fish Li 的 如何在Asp.Net應用程序中初始化 講的比較清楚。
對於調試log4Net,我在下文會有介紹,現在我們帶着前兩個問題的答案去用另外的一種方式配置log4net,看看效果如何:
配置方式二
第一步
在web項目根目錄下新建一個文件夾Config【用來存放自定義的配置文件】,然后再Config文件夾中建立一個文件叫LogNet.config
第二步
配置Log4Net.config文件,內容如下:

<?xml version="1.0" encoding="utf-8"?> <log4net debug="true"> <!--RootLog實例,子Log會繼承其特性--> <root> <level value="INFO" /> <!--啟用按日期分割--> <appender-ref ref="LogFileAppenderByDate" /> <!--啟用按容量分割--> <appender-ref ref="LogFileAppenderBySize" /> <!--啟用保存到數據庫--> <appender-ref ref="AdoNetAppender" /> </root> <logger name="testApp.Logging"> <!--設置testApp.Logging日志級別為DEBUG--> <level value="DEBUG"/> </logger> <!--按日期分割日志文件 一天一個--> <appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" > <!--是否續寫--> <param name="AppendToFile" value="true" /> <!--最小鎖定模型以允許多個進程可以寫入同一個文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--保存路徑--> <param name="File" value="d:\Log\\" /> <!--可以按天、小時、分鍾為Log命名--> <param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" /> <param name="StaticLogFileName" value="false" /> <param name="RollingStyle" value="Date" /> <!--最多保留的幾天的日志、這里我沒有驗證--> <param name="MaxBackupIndex" value="3" /> <!--日志輸出格式--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="時間:%d %n級別:%level %n類名:%c%n文件:%F 第%L行%n日志內容:%m%n-----------------------------------------%n%n" /> </layout> </appender> <!--按日志容量分割日志文件 10KB一個--> <appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" > <!--是否續寫--> <param name="AppendToFile" value="true" /> <!--最小鎖定模型以允許多個進程可以寫入同一個文件--> <param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--按照文件的大小進行變換日志文件--> <param name="RollingStyle" value="Size" /> <param name="File" value="log.txt" /> <!--單個文件最大數量 好像只有在 按Size分割時有效--> <param name="MaximumFileSize" value="200KB"/> <!--保留的log文件數量 超過此數量后 自動刪除之前的 好像只有在 按Size分割時有效--> <param name="MaxSizeRollBackups" value="2" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="發生時間:%d %n事件級別:%level %n相關類名:%c%n程序文件:%F 第%L行%n日志內容:%m%n-----------------------------------------%n%n" /> </layout> </appender> <!--記錄日志到數據庫--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <!--緩沖大小--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=DST56711\SEVEN;Initial Catalog=Log4Net;Persist Security Info=True;User ID=sa;Password=seven_123456" /> <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> </log4net>
第三步
在Global.asax中加入如下代碼
protected void Application_Start()
{
//..........其它初始化代碼
//Log4Net初始化代碼
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("Config/Log4Net.config")));
}
第四步
在相應的位置寫入記錄日志的代碼:
ILog log= LogManager.GetLogger("testApp.Logging");
log.Debug("DebugMvc");
第五步
觀察結果,結果和上面配置一種的結果一樣,這里就不截圖展示了。
結論
寫到這里我想大家大概已經明白了,這次我們沒有在web.config中做任何配置,也沒有在AssemblyInfo.cs文件中做任何改動,一樣可以按照我們需要的方式記錄日志。
這就證明了配置其實就是為了方便和高效的管理日志,不是log4net必須的(不過一般我們項目使用中都需要用配置來管理)而AssemblyInfo只是為了讓項目啟動是加載log4net的配置,在任何可以初始化的地方都可以做,現在我們在Global中實現。
關於log4net出現問題如何調試,我們在下篇文章中講解,如果對上面的有疑惑,請參考下面兩篇文章。