Log4net是一款非常好用、強大的開源日誌記錄組件,它來自於著名的Apache。起初是log4j專用於Java,後來又提供了log4net用於支持.NET。幫助.NET程序員也能夠輕鬆的處理日誌信息。
log4net是一個“庫”,用於幫助程序員輸出日誌到大量不同的輸出目標(文件、控制檯、不同的數據庫、甚至內存等等)。可以在這裏下載到它的最新版本。log4net
好,下面進入正題,在C#當中如何利用好這個“著名”的日誌組件呢?
我們可以按照下面的步驟來創建一個控制檯項目來利用log4net進行日誌的記錄:
1、創建一個控制檯項目,並添加log4net.dll引用
log4net.dll,這個文件可以從下載的包中找到。在創建好的控制檯項目中,直接添加引用這個文件就可以了。
2、創建一個log4net.config文件,用於單獨的進行log4net日誌信息的配置
配置文件是核心,它記錄了日誌的詳細的配置情況。log4net繼承了Java的優點,能夠以靈活的配置方式,將日誌信息輸出到不同的數據源。
下面展示了一個完整的log4net.config文件:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <!--添加log4net自定義節點-->
- <configSections>
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- </configSections>
- <log4net>
- <!--文件形式-->
- <appender name="FileAppender" type="log4net.Appender.FileAppender">
- <!--文件路徑-->
- <file value="log-file.txt"/>
- <!--是否追加-->
- <appendToFile value="true"/>
- <!--顯示格式-->
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
- </layout>
- </appender>
- <!--SqlServer形式-->
- <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="100" />
- <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <connectionString value="data source=10.77.137.119;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=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>
- <!--Access數據庫-->
- <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
- <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\桌面\test.mdb;User Id=;Password=;" />
- <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
- <parameter>
- <parameterName value="@log_date" />
- <dbType value="String" />
- <size value="255" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date" />
- </layout>
- </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="1024" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%message" />
- </layout>
- </parameter>
- </appender>
- <!--Oracle形式-->
- <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
- <!--數據庫連接類型-->
- <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <!--數據庫連接字符串-->
- <connectionString value="data source=orcl;User ID=damis;Password=damis" />
- <!--數據庫執行語句-->
- <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />
- <!--緩衝區大小-->
- <bufferSize value="128" />
- <!--數據庫表字段參數-->
- <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>
- </appender>
- <!--配置日誌的目標存儲形式-->
- <root>
- <!--文件形式-->
- <appender-ref ref="FileAppender"/>
- <!--SqlServer形式-->
- <appender-ref ref="AdoNetAppender_SqlServer"/>
- <!--Oracle形式-->
- <appender-ref ref="AdoNetAppender_Oracle"/>
- <!--Access形式-->
- <appender-ref ref="AdoNetAppender_Access"/>
- </root>
- </log4net>
- </configuration>
3、建立一個類Logger,用於進行日誌的記錄
在建好的Logger類中,添加如下代碼:
- //如果是winform或console等c/s程序,需要設置一下。
- //具體步驟:右鍵log4net.config文件-屬性-複製到輸出目錄:始終複製。目的是爲了每次啓動時能夠找到這個config文件
- [assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]
- namespace Log4net
- {
- /// <summary>
- /// 日誌記錄類
- /// </summary>
- public class Logger
- {
- #region 記錄日誌
- /// <summary>
- /// 記錄日誌
- /// </summary>
- /// <param name="legLevel">日誌級別</param>
- /// <param name="msg">日誌內容</param>
- public static void LoggerMsg(LogLevel legLevel, string msg)
- {
- log4net.ILog log = GetLogger();
- switch (legLevel)
- {
- case LogLevel.Debug: log.Debug(msg); break;//Debug
- case LogLevel.Error: log.Error(msg); break;//Error
- case LogLevel.Fatal: log.Fatal(msg); break;//Fatal
- case LogLevel.Info: log.Info(msg); break;//Info
- case LogLevel.Warn: log.Warn(msg); break;//Warn
- default: break;
- }
- }
- #endregion
- #region 獲得一個日誌記錄對象
- /// <summary>
- /// 獲得一個日誌記錄對象
- /// </summary>
- /// <returns>日誌記錄對象</returns>
- public static log4net.ILog GetLogger()
- {
- //MethodBase.GetCurrentMethod().DeclaringType 返回:命名空間名+類名
- return log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- }
- #endregion
- }
- /// <summary>
- /// 日誌記錄級別
- /// </summary>
- public enum LogLevel
- {
- Debug,
- Info,
- Warn,
- Error,
- Fatal,
- }
- }
4、在控制檯Main方法中進行測試
好了,最後一步,就是對上述的配置進行測試了。我們在Main方法中加上如下測試代碼。
- //主方法測試用
- Logger.LoggerMsg(LogLevel.Info, "hello,log4net!");
上面我演示了將日誌記錄輸出到文件、Sql Server數據庫、Oracle數據庫、Access數據庫等四種情況。如果有更多的其它數據源的輸出,可以參考官方網站:http://logging.apache.org/log4net/release/config-examples.html 。
最後看下執行的結果:
txt:
access 2007:
sqlserver 2008:
oracle 10g: