來源: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. 在
詳細程式碼如下:
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表示所有資訊都寫入,我們也可以透過:
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 ,比如:
PS:OFF表示所有資訊都不寫入,ALL表示所有資訊都寫入。
B:
3、
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、資料庫、運維等。