1.引言
日誌對於應用程式來說,其重要性不言無喻,在編碼時,可以協助開發人員偵錯工具.在應用發布以後,可以跟蹤應用程式的運行情況,必要時找出錯誤,或協助以後審計.然而在應用程式中插入日誌需要花費很多精力.一般來說大約4%的代碼是專門用來記錄日誌的.所以即使對於一個不大的應用軟體來說,也會插入上千條日誌代碼.在強調可重用組件開發的今天,除了自己的從頭到尾開發一個可重用的日誌操作類以外,對於.net應用程式,我們可以使用apache的log4net日誌操作包(對於java,則有Log4j).官方網站:http://logging.apache.org/log4net/,最新版本為1.2.10.
2.執行個體
log4net可以通過程式來配置,當然通過設定檔來配置會更靈活.讓我們來嘗試一下在一個簡單的應用MyApp中使用log4net.
如下(記得先引用log4net程式集):
using System;
using log4net;
using log4net.Config;
namespace Com.Foo
{
public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
BasicConfigurator.Configure();
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
Console.Read();
}
}
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Debug("Did it again!");
}
}
}
運行結果如下:
3.log4net簡介
3.1 Log4net的結構
log4net有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(布局).
3.1.1 Logger
Logger是log4net的核心組件,也是應用程式需要互動的主要組件,它代表了Log4net的日誌記錄器,它能夠對日誌資訊進行分類篩選,就是決定什麼日誌資訊應用被輸出,什麼日誌資訊應該被忽略。產生的日誌訊息並不直接顯示,還要預先經過Layout的格式化處理後才會輸出。
Log4net架構定義了一個ILog介面,所有的logger類都必須實現這個介面。如果你想實現一個自訂的logger,你必須首先實現這個介面。
ILog介面的定義如下:
public interface ILog
{
void Debug(object message);
void Info(object message);
void Warn(object message);
void Error(object message);
void Fatal(object message);
//以上的每一個方法都有一個重載的方法,用來支援異常處理。
//每一個重載方法都如下所示,有一個異常類型的附加參數。
void Debug(object message, Exception ex);
// ...
//Boolean 屬性用來檢查Logger的記錄層級
bool isDebugEnabled;
bool isInfoEnabled;
//… 其他方法對應的Boolean屬性
}
3.1.2 日誌的層級
log4net採用記錄層級機制,簡化了控制日誌的輸出步驟.
Fatal():輸出ERROR層級的日誌資訊.
Error():輸出ERROR層級的日誌資訊.
Warn() :輸出WARN層級的日誌資訊.
Info() :輸出INFO層級的日誌資訊.
Debug():輸出Debug層級的日誌資訊.
3.2 Appender(附著器)
Appender組件決定將日誌資訊輸出到什麼地方.比如控制台(Console),檔案(File).
3.3 Layout(布局)
Layout組件用來決定日誌的輸出格式.
4.使用設定檔來使用log4net
對於開始的例子可以如下:
using System;
using System.IO;
using log4net;
using log4net.Config;
namespace Com.Foo
{
public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
//BasicConfigurator.Configure();
XmlConfigurator.Configure(new System.IO.FileInfo("ConsoleApplication1.exe.config"));
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
Console.Read();
}
}
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Debug("Did it again!");
}
}
}
相應的設定檔如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!--log4net配置-->
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>
詳細解釋請參照:
http://logging.apache.org/log4net/release/manual/configuration.html