歡迎光臨
每天分享高質量文章

.NET版開源日誌框架Log4Net詳解

來源:Yaopengfei

連結:http://www.cnblogs.com/yaopengfei/p/9428206.html

一、Log4Net簡介

Log4net是從Java中的Log4j遷移過來的一個.Net版的開源日誌框架,它的功能很強大,可以將日誌分為不同的等級,以不同的格式輸出到不同的儲存介質中,比如:資料庫、txt檔案、記憶體緩衝區、郵件、控制檯、ANSI終端、遠端接收端等等,我們這裡主要介紹最常用的兩種:txt檔案和資料庫。

(PS:其它的儲存介質詳見 http://logging.apache.org/log4net/release/config-examples.html)

Log4net將日誌分為五個級別,分別是: FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般資訊) > DEBUG(除錯資訊),每個級別都對應著一組多載方法進行呼叫。

官網地址:http://logging.apache.org/log4net/index.html

Nuget地址:https://www.nuget.org/packages/log4net/

Nuget安裝:Install-Package log4net

最新版本:2.0.8 (2018-08-09)

本節主要圍繞兩個主要的儲存介質:【txt檔案】和【SQLServer資料庫】展開,涵蓋的知識點有:

①. 基本的使用步驟。

②. 初始化關聯配置檔案的幾種形式。

③. 程式碼呼叫詳解。

④. 配置檔案詳解。

⑤. 簡單的封裝和在MVC框架中的呼叫。 

二、基本使用步驟

我們先以控制檯程式為例,簡單介紹Log4net儲存日誌到txt文字檔案中,後面在做程式碼的詳解。


1、新建01-SimpleDemo控制檯程式,透過指令 【Install-Package log4net】安裝相應程式集。

2、在預設配置檔案中App.config(B/S程式則為web.config)中進行配置,主要分兩塊:

A. 在節點下新增節點下新增(要在其最頂部):

 

B. 在根節點下,配置log4net的核心配置程式碼, 主要節點如下:

詳細程式碼如下:

 

 

   

 

 

    

   

   

     

     

     

     

     

     

     

     

     

     

       

     

     

     

   

 

   

     

     

   

 

 

 

   

 

3、程式碼呼叫

log4net.Config.XmlConfigurator.Configure();

ILog log = LogManager.GetLogger(“test”);

log.Debug(“除錯資訊”);

4、執行結果

截止此處,日誌儲存成功。

三、初始化配置檔案

前面提到在預設配置檔案中App.config(B/S程式則為web.config)中進行配置,可以透過程式碼  log4net.Config.XmlConfigurator.Configure(); 來初始化配置,或者還可以透過 [assembly: log4net.Config.XmlConfigurator()]  反射的形式進行初始化配置,二者可以達到同樣的效果,代表了兩種初始化配置檔案的形式。

PS: [assembly: log4net.Config.XmlConfigurator()]  可以加在 當前使用檔案的 namespace上作用於當前檔案,或者加在Properties/AssemblyInfo.cs中,則該專案全域性都無須再初始化了。

 

在實際專案中,預設的配置檔案裡可能包含很多框架的資訊,這個時候把 log4net的配置程式碼再放入進去,就會顯得有點雜亂,或者有些“奇葩”的人把預設配置檔案改名了,這個時候使用上述預設的兩種方式就不好用了,那麼這種情況怎麼處理呢?

這裡重點介紹 透過 log4net.Config.XmlConfigurator.Configure(); 來關聯配置檔案。

情況一: 使用預設配置檔案的情況

1、程式碼配置:log4net.Config.XmlConfigurator.Configure();

2、反射配置:[assembly: log4net.Config.XmlConfigurator()] 

情況二:修改預設配置檔案的名稱為:App1.config (這裡只是舉例,很少有修改預設配置檔案名稱的)

1、程式碼配置: 首先將App1.config檔案的屬性中的“生成操作”改為“ 嵌入的資源”,然後透過以下程式碼進行配置。

Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream(“_01_SimpleDemo.App1.config”);

log4net.Config.XmlConfigurator.Configure(xml);

註:程式碼中的 _01_SimpleDemo 為名稱空間名。

2、反射配置:[assembly: log4net.Config.XmlConfigurator(ConfigFile = “log4net.xml”)]     

註:用這種方式屬性中的:複製到輸出目錄需要改為:始終複製,生成操作不需要配置,使用預設:無  即可

 

情況三:新建單獨xml檔案,進行log4net的配置 (推薦採用這種方式,和原配置檔案區分開,單獨配置方便,處理方式和情況二是一致的)

1、程式碼配置:首先將log4net.xml檔案的屬性中的“生成操作”改為“ 嵌入的資源”,然後透過以下程式碼進行配置。

Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream(“_01_SimpleDemo.log4net.xml”);

log4net.Config.XmlConfigurator.Configure(xml);

註:程式碼中的 _01_SimpleDemo 為名稱空間名。

情況四:無論是修改預設配置檔案的名稱為 或者 新建單獨的xml作為配置檔案 → 可以透過絕對路徑的方式進行處理 【不推薦這種方式】

1、直接寫絕對路徑 (註意這種方式【不需要】配置檔案屬性為 “嵌入的資源”)

log4net.Config.XmlConfigurator.Configure(new FileInfo(@”D:-我的開發之路DotNet體系-DotNet框架篇-Log4net詳解Code-SimpleDemolog4net.xml”));

2 透過程式碼獲取絕對路徑 (註意這種方式【不需要】配置檔案屬性的“生成操作”改為 “嵌入的資源”,但需要改為“始終複製”,確保輸出到bin檔案下)

string assemblyFilePath = Assembly.GetExecutingAssembly().Location;

string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);

string configFilePath = assemblyDirPath + ” //log4net.xml”;

log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));

PS:B/S程式下透過  log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath(“~”) + @”/log4net.xml”)); 來配置。

四、程式碼呼叫詳解

Log4net允許多個ILog物件同時存在,透過程式碼:ILog log = LogManager.GetLogger(“xxx”); 來建立。

A: 日誌級別由高到低分別為:FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般資訊) > DEBUG(除錯資訊),另外還有 OFF和 ALL 。

幾點說明:OFF表示所有資訊都不寫入,ALL表示所有資訊都寫入,我們也可以透過:這樣配置,表示WARN級別以及高於WARN以上的級別才會被寫入日誌。

B: 寫入日誌的方法有:Debug、Error、Fatal、Info、Warn五個方法,每個方法都有兩個多載,如下圖:

分享在使用配置檔案為log4net.xml的情況下的呼叫程式碼:

Assembly assembly = Assembly.GetExecutingAssembly();

var xml = assembly.GetManifestResourceStream(“_01_SimpleDemo.log4net.xml”);

log4net.Config.XmlConfigurator.Configure(xml);

ILog log = LogManager.GetLogger(“test”);

log.Debug(“除錯資訊”);

log.Info(“一般資訊”);

log.Warn(“警告”);

try

{

   int.Parse(“ddd”);

}

catch (Exception ex)

{

    log.Error(“一般錯誤”, ex);

}

log.Fatal(“致命錯誤”);

五、配置檔案詳解

Log4net的配置檔案主要分為兩大部分:分別是 【自定義配置節點】和 

【核心程式碼配置】,自定義配置節點程式碼固定,如下圖,核心程式碼配置主要位於:節點中,裡麵包括節點配置日日誌輸出途徑 和 節點,用於設定記錄日誌的級別和啟用哪些輸出途徑。  

幾點說明:

1、自定義配置節點  

程式碼固定,直接複製即可。

2、 節點主要用來: 配置日誌的的輸出級別和載入日誌的輸出途徑。

A: level中的value值表示該值及其以上的日誌級別才會輸出,日誌級別包括:OFF > FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般資訊) > DEBUG(除錯資訊) > ALL ,比如:

表示只有INFO及其以上的日誌級別才會被儲存。

PS:OFF表示所有資訊都不寫入,ALL表示所有資訊都寫入。

B: 標簽用於載入日誌的輸出途徑程式碼,透過ref和appender標簽的中name屬性相關聯,比如:

 表示開啟txt檔案儲存日誌的方式。

3、節點,用來配置日誌的輸出途徑的,本節主要介紹了輸出到 【txt文字檔案】中 和 【資料庫】。

A:分享一下資料庫的表結構,詳細配置見下麵的程式碼分享,需要註意欄位型別相匹配,並且要顯式指定其長度。

 

B:關於txt文字檔案的命名,可以存放到一個檔案夾裡,也可以按照時間來區分檔案夾,並且命名可以 動態+指定命名的方式。

C:關於日誌檔案大小的說明和檔案個數的說明,主要需要三個節點配合使用(實際開發中,如果一個txt特別大,開啟的時候會非常的慢,卡頓,所以該步驟有必要配置一下)。

PS:首先要配置 RollingStyle 節點為Size樣式或者Composite樣式,然後配置 maximumFileSize 節點設定每個檔案的大小,最後配置 MaxSizeRollBackups 節點,設定日誌檔案的個數。超出大小後在所有檔案名後自動增加正整數重新命名,數字最大的最早寫入。

用下麵的程式碼簡單測試一下:

詳細程式碼如下:

 

 

   

 

 

 

   

   

   

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

       

     

   

   

   

     

     

     

     

     

     

     

     

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

     

     

     

       

       

       

     

   

   

   

     

     

     

     

     

     

     

   

 

六、簡單的封裝及完整程式碼分享

這裡模擬在系統框架中對Log4net進行簡單的封裝,然後在MVC框架中呼叫,並分享全部程式碼。

步驟一:新建Ypf.Utils類庫,作為工具類庫,引入log4net程式集,並將前面用到的log4net.xml 複製進來,改屬性為嵌入資源,然後新建LogUtils類(不要起名為LogHelp),對Log4net的方法進行簡單的封裝,主要包括:初始化程式碼、ILog實體建立、五類日誌級別的封裝。

 log4net.xml檔案程式碼如下:

 

 

   

   

     

   

   

   

     

     

     

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

         

       

     

 

     

     

       

       

       

       

       

       

       

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

         

       

     

     

     

       

       

       

       

     

     

     

       

       

       

     

   

   

   

     

     

     

     

     

     

     

   

 

LogUtils類程式碼如下:

using log4net;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Text;

using System.Threading.Tasks;

namespace Ypf.Utils

{

    public class LogUtils

    {

        //可以宣告多個日誌物件

        public static ILog log = LogManager.GetLogger(typeof(LogUtils));

        #region 01-初始化Log4net的配置

        ///

        /// 初始化Log4net的配置

        /// xml檔案一定要改為嵌入的資源

        ///

        public static void InitLog4Net()

        {

            Assembly assembly = Assembly.GetExecutingAssembly();

            var xml = assembly.GetManifestResourceStream(“Ypf.Utils.log4net.xml”);

            log4net.Config.XmlConfigurator.Configure(xml);

        }

        #endregion

        /************************* 五種不同日誌級別 *******************************/

        //FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般資訊) > DEBUG(除錯資訊)

        #region 01-DEBUG(除錯資訊)

        ///

        /// Debug

        ///

        /// 日誌資訊

        public static void Debug(string msg)

        {

            log.Debug(msg);

        }

        ///

        /// Debug

        ///

        /// 日誌資訊

        /// 錯誤資訊

        public static void Debug(string msg, Exception exception)

        {

            log.Debug(msg, exception);

        }

        #endregion

        #region 02-INFO(一般資訊)

        ///

        /// Info

        ///

        /// 日誌資訊

        public static void Info(string msg)

        {

            log.Info(msg);

        }

        ///

        /// Info

        ///

        /// 日誌資訊

        /// 錯誤資訊

        public static void Info(string msg, Exception exception)

        {

            log.Info(msg, exception);

        }

        #endregion

        #region 03-WARN(警告)

        ///

        /// Warn

        ///

        /// 日誌資訊

        public static void Warn(string msg)

        {

            log.Warn(msg);

        }

        ///

        /// Warn

        ///

        /// 日誌資訊

        /// 錯誤資訊

        public static void Warn(string msg, Exception exception)

        {

            log.Warn(msg, exception);

        }

        #endregion

        #region 04-ERROR(一般錯誤)

        ///

        /// Error

        ///

        /// 日誌資訊

        public static void Error(string msg)

        {

            log.Error(msg);

        }

        ///

        /// Error

        ///

        /// 日誌資訊

        /// 錯誤資訊

        public static void Error(string msg, Exception exception)

        {

            log.Error(msg, exception);

        }

        #endregion

        #region 05-FATAL(致命錯誤)

        ///

        /// Fatal

        ///

        /// 日誌資訊

        public static void Fatal(string msg)

        {

            log.Fatal(msg);

        }

        ///

        /// Fatal

        ///

        /// 日誌資訊

        /// 錯誤資訊

        public static void Fatal(string msg, Exception exception)

        {

            log.Fatal(msg, exception);

        }

        #endregion

    }

}

步驟二:新建名Ypf.MVC的MVC5框架,新增對Ypf.Utils類庫的取用,在Global.asax全域性檔案中新增對 對Log4net進行初始化。

然後就可以愉快的進行呼叫測試了哦。

///

/// 測試log4net

/// 首先需要再Global中初始化log4net

///

///

public ActionResult Index()

{

    //FATAL(致命錯誤) > ERROR(一般錯誤) > WARN(警告) > INFO(一般資訊) > DEBUG(除錯資訊)

    LogUtils.Debug(“出錯了”);

    try

    {

        int.Parse(“ddf”);

    }

    catch (Exception ex)

    {

        LogUtils.Debug(“出錯了”,ex);

    }

    LogUtils.Info(“出錯了”);

    try

    {

        int.Parse(“ddf”);

    }

    catch (Exception ex)

    {

        LogUtils.Info(“出錯了”, ex);

    }

    LogUtils.Warn(“出錯了”);

    try

    {

        int.Parse(“ddf”);

    }

    catch (Exception ex)

    {

        LogUtils.Warn(“出錯了”, ex);

    }

    LogUtils.Error(“出錯了”);

    try

    {

        int.Parse(“ddf”);

    }

    catch (Exception ex)

    {

        LogUtils.Error(“出錯了”, ex);

    }

    LogUtils.Fatal(“出錯了”);

    try

    {

        int.Parse(“ddf”);

    }

    catch (Exception ex)

    {

        LogUtils.Fatal(“出錯了”, ex);

    }

    return View();

}

看完本文有收穫?請轉發分享給更多人~



●編號136,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類公眾微信

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂