今天體驗了一把用log4net寫.NET應用程序日誌。html
log4net的官方網站地址: http://logging.apache.org/log4net/數據庫
log4net的下載地址:http://logging.apache.org/log4net/download_log4net.cgiapache
在這個地址能夠下載 log4net 的源碼,也能夠直接下載編譯好的版本(dll庫)。直接編譯好的release版有兩個,分別是log4net-1.2.15-bin-newkey.zip和log4net-1.2.15-bin-oldkey.zip,這兩個release版的區別是:前者對程序集使用了強名稱簽名(strong name key)。app
There are two different binary releases, oldkey and newkey. Both contain assemblies built for most supported platforms and have been built from the same code base, they only differ in the strong name key used to sign the assemblies.函數
See the FAQ for background. We recommend you use the assemblies signed with the "new" key whenever possible.測試
官方建議若是條件容許儘可能使用newkey的版本,所以咱們也使用這個版本,下載連接:網站
http://mirrors.tuna.tsinghua.edu.cn/apache//logging/log4net/binaries/log4net-1.2.15-bin-newkey.zipui
下載並解壓縮後,發現這個zip文件裏面有不少個release版dll,這裏咱們用net4.0的版本spa
新建一個C#控制檯應用程序工程,引用其中的log4net.dll.net
在工程中新建一個xml文件,取名爲log4net.config,代碼以下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!-- Appender:輸出到文件 --> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日誌路徑--> <param name= "File" value= "log\"/> <!--是不是向文件中追加日誌--> <param name= "AppendToFile" value= "true"/> <!--日誌文件名是不是固定不變的--> <param name= "StaticLogFileName" value= "false"/> <!--日誌文件名格式爲:年-月-日.log--> <param name= "DatePattern" value= "yyyy-MM-dd".log""/> <!--日誌根據日期滾動--> <param name= "RollingStyle" value= "Date"/> <!--日誌輸出格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> </layout> <!--日誌輸出等級--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <!--輸出到文件的日誌,不包含Debug--> <param name="LevelMax" value="Fatal" /> </filter> </appender> <!-- Appender:輸出到控制檯 --> <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> <!--調試類型日誌--> <mapping> <level value="Debug" /> <foreColor value="White" /> </mapping> <!--通常類型日誌--> <mapping> <level value="Info" /> <foreColor value="White, HighIntensity" /> </mapping> <!--警告類型日誌--> <mapping> <level value="Warn" /> <foreColor value="Yellow, HighIntensity" /> </mapping> <!--錯誤類型日誌--> <mapping> <level value="Error" /> <foreColor value="Red, HighIntensity" /> </mapping> <!--致命錯誤日誌--> <mapping> <level value="Fatal" /> <backColor value="White, HighIntensity" /> <foreColor value="Red, HighIntensity" /> </mapping> <!--日誌輸出格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <!--日誌輸出等級--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Debug" /> <param name="LevelMax" value="Fatal" /> </filter> </appender> <!--註冊Appender--> <root> <appender-ref ref="RollingLogFileAppender"/> <appender-ref ref="ColoredConsoleAppender"/> </root> </log4net> </configuration>
log4net的配置項教程,網上能搜索到不少。基本邏輯是,定義若干個Appender,再在root節點中註冊一下這些Appender。
log4net官網對Appender的定義方法有着很是詳細的介紹(都是英文的):
http://logging.apache.org/log4net/release/config-examples.html
如今設計工程結構以下:
其中,Program.cs代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Threading; using log4net; using log4net.Config; namespace Log4NetTest { class Program { static void Main(string[] args) { //加載log4net配置 FileInfo configFile = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(configFile); //建立logger var logger = LogManager.GetLogger(typeof(Program)); //一、使用logger寫日誌(最簡單的調用) logger.Debug("調試類型日誌"); logger.Info("通常類型日誌"); logger.Warn("警告類型日誌"); logger.Error("錯誤類型日誌"); logger.Fatal("致命錯誤日誌"); Console.WriteLine(); //二、使用logger寫日誌(異常信息的日誌) try { TestFunc1(); } catch (Exception ex) { logger.Error("捕獲異常測試", ex); } Console.WriteLine(); //三、使用logger寫日誌(其餘線程的日誌) Thread thread = new Thread(() => { try { TestFunc1(); } catch (Exception ex) { logger.Error("捕獲異常測試2", ex); } }); thread.IsBackground = true; thread.Start(); Thread.Sleep(2000); Console.WriteLine(); //三、使用logger寫日誌(其餘類的日誌) TestClass.WriteLog("TestClass.WriteLog調用測試"); Console.Read(); } //測試用函數 TestFunc1 TestFunc2 TestFunc3 static void TestFunc1() { TestFunc2(); } static void TestFunc2() { TestFunc3(); } static void TestFunc3() { int a = 1; int b = 0; int i = a / b; } } }
其中引用到的TestClass類代碼以下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net; namespace Log4NetTest { class TestClass { public static void WriteLog(string log = "") { var logger = LogManager.GetLogger(typeof(TestClass)); logger.Info(log); } } }
程序運行結果以下:
寫入到文本文件中的內容以下:
最後總結一下log4net的基本使用方法:
一、引用log4net.dll
二、配置log4net.config文件,並在代碼中使用XmlConfigurator.ConfigureAndWatch方法加載
三、使用LogManager.GetLogger方法獲取當前類的logger
四、使用logger寫日誌,根據log4net.config的定義,日誌能夠寫到控制檯、文本文件、數據庫等位置
參考文獻:
柄棋先生,C#使用Log4Net記錄日誌
http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
周公,log4net使用詳解
http://blog.csdn.net/zhoufoxcn/article/details/2220533
周公 ,Log4Net使用詳解(續)
http://www.cnblogs.com/zhoufoxcn/archive/2010/11/23/2515616.html
END