Log4Net學習【三】


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>
View Code

第三步

在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出現問題如何調試,我們在下篇文章中講解,如果對上面的有疑惑,請參考下面兩篇文章。

Log4Net學習【二】

Log4Net學習【一】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM