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"-test.txt""/>
<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
詳解
- 配置
-
<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>标簽寫在第一個的位置,試了好久都寫不出日志檔案。而這一點在我學習過程中找到的資料中都沒有強調,我覺得可能會有其他人也在這裡出問題,是以就把它記錄下來,提供參考。