C# 使用 log4net 記錄日志


Ø  前言

在一般的開發應用中,都會涉及到日志記錄,用於排查錯誤 或 記錄程序運行時的日志信息。log4net 庫是 Apache log4j 框架在 Microsoft .NET 平台的實現,是一個幫助程序員將日志信息輸出到各種目標(控制台、文件、數據庫等)的組件。

下面介紹下如何在 C# 中如何使用 log4net 記錄日志,主要分為以下幾點:

1.   引用 log4net.dll 程序集。

2.   編寫 log4net 的配置信息。

3.   調用(記錄日志)。

4.   其他。

 

1.   引用 log4net.dll 程序集(不多說很簡單)

1)   使用 NuGet 包管理器下載 log4net。下載成功后會包含 log4net.dll log4net.xml 文件。

2)   或者在項目中手動引用 log4net.dll 程序集。

3)   引入 log4net 命名空間。

 

2.   編寫 log4net 的配置信息

1)   App.config Web.config 配置文件的根節點“<configuration>”中加入如下配置:

1.   section 節點(注意:configSections 節點必須為 configuration 的第一個子節點

<configSections>

  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

</configSections>

 

2.   log4net 節點

<log4net>

  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

    <!--輸出日志的編碼方式(可以解決中文亂碼)-->

    <param name="Encoding" value="utf-8" />

    <!--創建日志文件的方式-->

    <param name="RollingStyle" value="date"/>

    <!--日志文件存儲在程序運行時目錄的 Logs 文件夾中-->

    <param name="File" value="Logs\"/>

    <!--日志文件名格式,例如:2017-08-14.log-->

    <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;"/>

    <!--日志文件名是否為靜態-->

    <param name="StaticLogFileName" value="false"/>

    <!--備份日志數量-->

    <param name="MaxSizeRollBackups" value="10"/>

    <!--是否是向文件中追加日志-->

    <param name="AppendToFile" value="true"/>

    <!--日志信息排版模式-->

    <layout type="log4net.Layout.PatternLayout">

      <param name="ConversionPattern" value="%n%-6p%d{yyyy-MM-dd HH:mm:ss:fff}%n消息:%m%n位置:%l%n"/>

    </layout>

  </appender>

  <!--注意:該節點不能少-->

  <root name="logerror">  <!--日志類的名字-->

    <level value="all" /> <!--定義記錄的日志級別-->

    <appender-ref ref="RollingLogFileAppender"/>  <!--記錄到什么介質中-->

  </root>

</log4net>

 

3.   參數節點解釋

1)   RollingStyle:創建日志文件的方式,可選值:

1.   date:按日期。

2.   composite:按日期及文件大小,默認值。

3.   size:按文件大小。

4.   once:每啟動一次創建一個新文件。

2)   File:日志文件夾目錄或名稱。當 RollingStyle date composite 時,設置日志存儲目錄;否則,設置目錄+文件名,已經擴展支持虛擬目錄。

3)   DatePattern:日志文件名的日期格式,只有當 RollingStyle date/composite 時有效。

4)   StaticLogFileName:日志文件名是否為靜態。true/fasle,默認為 true。為 true 時,RollingStylerdate值將無效,這時需要設置 File 的文件名。

5)   MaximumFileSize:當RollingStyleComposite Size 時,設置最大文件大小,可選值:BKBMBGB,默認為字節。例如:10MB

6)   MaxSizeRollBackups備份日志數量,默認為0。在CountDirection為負數時有效。

7)   CountDirection默認值為-1。當文件超過MaximumFileSize的大小時,如果要創建新的文件來存儲日志,會根據CountDirection的值來重命名文件。大於-1的值時,File設置的文件名會依次加上012遞增。當等於或小於-1時,創建依賴於MaxSizeRollBackups參數值。

8)   AppendToFile:當日志文件存在時,是否向日志文件中追加內容。true/fasle,默認為 true

9)   Threshold起始日志級別,低於此級別的日志不會被記錄。

 

4.   conversionPattern 節點解釋

Ø  下面是 conversionPattern 節點的解釋,注意區分大小寫。

1)   %newline, %n          換行。

2)   %數字,%-數字:         表示該項的固定長度。長度不足時:“%數字”在前面填充空格,“%-數字”則在后面填充空格。

3)   %username             登錄用戶名,例如:LCLGO\GOO

4)   %property, %P, %X     機器名及登錄用戶名:{log4net:Identity=, log4net:UserName=LCLGO\GOO, log4net:HostName=LCLGO}

5)   %thread, %t           線程Id

6)   %date, %d             日期,格式化:%d{yyyy-MM-dd HH:mm:ss:fff}

7)   %level, %p            消息等級(INFODEBUGWARNERRORFATAL)。

8)   %message, %m          消息內容。

9)   %type, %class, %C     記錄日志的 Class 名稱。

10)  %method, %M           記錄日志的方法名,例如:Method1

11)  %location, %l         日志記錄位置,例如:Log4netTest.MyLog4net.Method1(f:\Log4netTest\MyLog4net.cs:42)

12)  %line, %L             語句所在行號,例如:42

13)  %file, %F             日志所在 class 文件絕對路徑,例如:f:\Log4netTest\MyLog4net.cs

14)  %logger, %c           Logger 名稱。

15)  %timestamp, %r        程序從運行到執行到當前語句時消耗的毫秒數。

16)  %x                    輸出:(null)

17)  %exception            異常信息。

18)  %property{Operator}   操作者ID

19)  %property{Action}     操作類型。

20)  %property{Message}    消息描述。

21)  %property{NDC}        輸出:(null)

2)   也可以單獨為 log4net 創建一個配置文件,命名為“log4net.config”,同樣加入同上的配置信息。

3)   注意:在 App.config Web.config 中設置了配置,如果又在 log4net.config 中也設置了配置,則加載 App.config Web.config 中的配置。

 

3.   其他配置方式(可參考)

<log4net>

  <root>

    <!--控制級別,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->

    <!--比如定義級別為INFO,則INFO級別向下的級別,比如DEBUG日志將不會被記錄-->

    <!--如果沒有定義LEVEL的值,則缺省為DEBUG-->

    <level value="ERROR"/>

    <appender-ref ref="RollingFileAppender"/>

  </root>

  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

    <!--日志文件名開頭-->

    <file value="c:\Log\TestLog4net.TXT"/>

    <!--多線程時采用最小鎖定-->

    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

    <!--日期的格式,每天換一個文件記錄,如不設置則永遠只記錄一天的日志,需設置-->

    <datePattern value="(yyyyMMdd)"/>

    <!--是否追加到文件,默認為true,通常無需設置-->

    <appendToFile value="true"/>

    <!--變換的形式為日期,這種情況下每天只有一個日志-->

    <!--此時MaxSizeRollBackupsmaximumFileSize的節點設置沒有意義-->

    <!--<rollingStyle value="Date"/>-->

    <!--變換的形式為日志大小-->

    <!--這種情況下MaxSizeRollBackupsmaximumFileSize的節點設置才有意義-->

    <RollingStyle value="Size"/>

    <!--每天記錄的日志文件個數,與maximumFileSize配合使用-->

    <MaxSizeRollBackups value="10"/>

    <!--每個日志文件的最大大小-->

    <!--可用的單位:KB|MB|GB-->

    <!--不要使用小數,否則會一直寫入當前日志-->

    <maximumFileSize value="2MB"/>

    <!--日志格式-->

    <layout type="log4net.Layout.PatternLayout">

      <conversionPattern value="%date [%t]%-5p %c - %m%n"/>

    </layout>

  </appender>

</log4net>

 

4.   調用(記錄日志)

1)   首先,需要加載配置文件,有兩種方式:

1.   在程序入口的命名空間頭部添加程序集特性,例如:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

namespace Log4netTest

{ }

注:

1)   省略 ConfigFile 屬性時,則加載 App.config Web.config 的配置。

2)   該定義之后,其他程序集同樣可以輸出日志。

 

2.   代碼加載

1)   加載 App.config Web.config 中的配置:

log4net.Config.XmlConfigurator.Configure();

2)   加載 log4net.config 文件中的配置:

var configFile = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"));

log4net.Config.XmlConfigurator.ConfigureAndWatch(configFile);

3)   加載配置位置:

1.   控制台應用程序、WinForm,可在 Main() 方法中調用。

2.   WebFormMVCWeb API,可在 Global.asax Application_Start() 方法中調用。

 

3.   注意:如果使log4net.config 文件中的配置,記得將該文件的復制到輸出目錄的屬性設置為始終復制 或 如果較新則賦值。

 

2)   記錄日志

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using log4net;

 

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

namespace Log4netTest

{

    class Program

    {

        static void Main(string[] args)

        {

            Log4netTest2.MyLog4net myLog4net1 = new Log4netTest2.MyLog4net();

            myLog4net1.Method1();

            Console.ReadLine();

        }

    }

}

 

namespace Log4netTest2

{

    /// <summary>

    /// Log4net 測試類。

    /// </summary>

    public class MyLog4net

    {

        /*

         * 步驟:

         * 1. 使用 NuGet 安裝 log4net

         * 2. 將配置信息加入 Web.config/App.config 中,

         *    或另外添加 log4net.config 配置文件(注意:設置該文件屬性的“復制到輸出目錄”為“始終復制”)。

         * 3. 調用。

         */

 

        /// <summary>

        /// 根據類名獲取日志記錄器對象。

        /// </summary>

        private static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 

        public static void InitLog4Net()

        {

            //log4net.Config.XmlConfigurator.Configure();

 

            //var configFile = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"));

            //log4net.Config.XmlConfigurator.ConfigureAndWatch(configFile);

        }

 

        /// <summary>

        /// 測試方法1

        /// </summary>

        public void Method1()

        {

            InitLog4Net();

 

            Logger.Info("這是 Info() 方法,用於記錄【消息】。");

            Logger.Debug("這是 Debug() 方法,用於記錄【調試】消息。");

            Logger.Warn("這是 Warn() 方法,用於記錄【警告】消息。");

            Logger.Error("這是 Error() 方法,用於記錄【異常】消息。");

            Logger.Fatal("這是 Fatal() 方法,用於記錄【嚴重錯誤】消息。");

 

            //Logger.Info(new Exception("這是 Info() 方法。【消息】"));

            //Logger.Debug(new Exception("這是 Debug() 方法。【調試】"));

            //Logger.Warn(new Exception("這是 Warn() 方法。【警告】"));

            //Logger.Error(new Exception("這是 Error() 方法。【異常】"));

            //Logger.Fatal(new Exception("這是 Fatal() 方法。【嚴重錯誤】"));

 

            try

            {

                string str = null;

                str = str.ToString();

            }

            catch (Exception ex)

            {

                Logger.Info(ex);

            }

 

            try

            {

                Method2();

            }

            catch (Exception ex)

            {

                Logger.Error(ex);

            }

        }

 

        /// <summary>

        /// 方法2

        /// </summary>

        public static void Method2()

        {

            throw new Exception("方法2 拋出自定義異常");

        }

    }

}

 

3)   執行以上代碼,將輸出如下日志:

clip_image001[1]

clip_image003[1]

 

5.   其他

1)   除了以上給出的“日志信息排版模式”,例如:%d。其實,還可擴展自定義的排版模式,有興趣的童鞋可以研究下,參考:http://www.cnblogs.com/cxd4321/archive/2012/07/21/2602378.html

2)   如果希望將日志寫入到數據庫中,也是可以的。本文也沒去嘗試,有興趣的話可參考:http://blog.csdn.net/kongwei521/article/details/52242319

3)   其他參考鏈接:

http://www.cnblogs.com/kissazi2/p/3392605.html

http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html

 

Ø  總結

對於 log4net,本人也只是初次接觸(在實際的項目中使用到),以前也只是有點了解(只知道有這個組件)。因為要掌握它,就必須熟悉不少配置屬性,所以特意整理下,方便日后忘記了查看。有好的建議或意見的朋友,歡迎提出,共同學習嘛^_^。好了,休息了。。。


免責聲明!

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



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