Ø 前言
在一般的開發應用中,都會涉及到日志記錄,用於排查錯誤 或 記錄程序運行時的日志信息。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".log""/>
<!--日志文件名是否為靜態-->
<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 時,RollingStyler的date值將無效,這時需要設置 File 的文件名。
5) MaximumFileSize:當RollingStyle為Composite 或 Size 時,設置最大文件大小,可選值:B、KB、MB、GB,默認為字節。例如:10MB。
6) MaxSizeRollBackups:備份日志數量,默認為0。在CountDirection為負數時有效。
7) CountDirection:默認值為-1。當文件超過MaximumFileSize的大小時,如果要創建新的文件來存儲日志,會根據CountDirection的值來重命名文件。大於-1的值時,File設置的文件名會依次加上0、1、2遞增。當等於或小於-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: 消息等級(INFO、DEBUG、WARN、ERROR、FATAL)。
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"/>
<!--變換的形式為日期,這種情況下每天只有一個日志-->
<!--此時MaxSizeRollBackups和maximumFileSize的節點設置沒有意義-->
<!--<rollingStyle value="Date"/>-->
<!--變換的形式為日志大小-->
<!--這種情況下MaxSizeRollBackups和maximumFileSize的節點設置才有意義-->
<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. WebForm、MVC、Web 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) 執行以上代碼,將輸出如下日志:
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,本人也只是初次接觸(在實際的項目中使用到),以前也只是有點了解(只知道有這個組件)。因為要掌握它,就必須熟悉不少配置屬性,所以特意整理下,方便日后忘記了查看。有好的建議或意見的朋友,歡迎提出,共同學習嘛^_^。好了,休息了。。。