天天看點

log4net簡單的配置以及在配置過程中遇到的問題log4net簡單的配置以及在配置過程中遇到的問題

log4net簡單的配置以及在配置過程中遇到的問題

這一篇部落客要是為了記錄我在初接觸log4net,進行相關的配置時遇到的一個問題

前面加了我自己做的學習log4net的學習筆記,寫的比較粗略,不适用于做學習的參考,主要看最後一部分遇到的那一個問題

希望能通過我的記錄幫助到和我一樣的學習者們

執行個體

配置樣例(将日志寫入復原檔案)在CS程式的App.config或者BS程式的Web.config裡配置:

<configSections>
	<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<configuration>
	<log4net>
		<root>
			<level value="WARN"/>
			<appender-ref="ReflectionLayout"/>
            <appender-ref="ConsoleAppender"/>
		</root>
		<logger name="App_Data" additivity="false">
        	<level value="DEBUG"/>
            <appender-ref ref="ReflectionLayout"/>
            <appender-ref ref="ConsoleAppender"/>
        </logger>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        	<layout type="log4net.Layout.PatternLayout">
            	<param name="ConversionPattern" value="%d %n%m%n"/>
            </layout>
        </appender>
        <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
        	<!-- 日志檔案的路徑,此處代表日志檔案寫在目前項目運作路徑下的logs檔案夾中,如果不存在logs則自動建立-->
            <param name="File" value="logs/"/>
            <!-- 是否追加到檔案-->
            <param name="AppendToFile" value="true"/>
            <!-- 記錄日志寫入檔案時,不鎖定文本檔案,防止多線程時不能寫log-->
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
            <!-- 使用UTF-8編碼-->
            <Encoding value="UTF-8"/>
            <!-- 最多産生的日志檔案數,如果超過數量隻會保留最新的n個,-1表示無數量限制-->
            <param name="MaxSizeRollBackups" value="-1"/>
            <!-- 是否隻寫到一個檔案中-->
            <param name="StaticLogFileName" value="false"/>
            <!-- 按照何種方式産生多個日志檔案(日期[date],檔案大小[size],混合[composite]),我這裡用的是按照日期産生日志檔案-->
            <param name="RollingStyle" value="date"/>
            <!-- 按日期生成檔案夾,并在檔案名前也加上日期-->
            <param name="DatePattern" value="yyyyMMdd-HHmm&quot;-test.txt&quot;"/>
            <filter type="log4net.Filter.LevelRangeFilter">
            	<param name="LevelMin" value="DEBUG"/>
                <param name="LevelMax" value="WARN"/>
            </filter>
            <layout type="log4net.Layout.PatternLayout">
            	<param name="ConversionPattern" value="%d %n%m%n"/>
            </layout>
        </appender>
	</log4net>
</configuration>
           

使用log4net記錄日志的例子(C#):

log4net.ILog log = log4net.LogManager.GetLogger("App_Data");
	log.Info("test");
           

需要注意的是,如果是CS程式,要在根目錄的Program.cs的Main方法中加上

log4net.Config.XmlConfigurator.Configure();
           

如果是BS程式,要在根目錄的Global.asax.cs(沒有建立一個)中的Application_Start方法中加上

log4net.Config.XmlConfigurator.Configure();
           

無論是BS還是CS程式,都可以直接在項目的AssemblyInfo.cs中添加以下語句:

[assembly:log4net.Config.XmlConfigurator()]
           

運作上面的例子,就在此項目的運作目錄下的logs檔案夾中建立了以目前日期為名稱的檔案夾,并在其中建立了名為"目前時間-test.txt"的檔案,檔案内容為

2020-10-23 10:21:46,493 
test
           

詳解

  1. 配置
    • <root>

      實際上就是一個根logger,所有其他的logger都預設繼承它

      支援的子元素:

      appender-ref 0個或多個,表示要引用的appender的名字
      level 最多一個,隻有在這個級别或之上的時間才能被記錄
      param 0個或多個,設定一些參數
    • <logger>

      logger直接與應用程式互動,是日志的産生者,産生日志後由它引用的Appender記錄到指定的媒介,并由Layout控制輸出格式

      屬性:

      name logger的名字,必須有
      additivity 可選,預設值為true。設定成false将阻止父logger中的appender
      子元素:
      appender-ref 引用的appender的名字
      level 隻有在這個級别或以上的事件才會被記錄
      param 0個或多個,設定一些參數
    • <appender>

      負責記錄日志的元件,定義日志的輸出方式,常見的輸出方式有記錄到控制台(ConsoleAppender)、記錄到檔案(FileAppender)、記錄到復原檔案(RollingFileAppender)等

      屬性:

      name Appender的名字
      type 輸出方式的類型
      子元素:
      filter 定義此app使用的過濾器
      layout 最多一個,定義appender的輸出格式
      param 設定一些參數

配置時遇到的問題

​ <configSections>标簽必須定義在<configuration>标簽内,最多隻能有一個,而且如果有的話必須是<configuration>下的第一個子元素

我剛開始就犯了這個錯誤,沒有把<configSections>标簽寫在第一個的位置,試了好久都寫不出日志檔案。而這一點在我學習過程中找到的資料中都沒有強調,我覺得可能會有其他人也在這裡出問題,是以就把它記錄下來,提供參考。