常見(jiàn)面,卻不怎么用,究其原因還是覺(jué)得太復(fù)雜了點(diǎn)。不過(guò),這東西出現(xiàn)次數(shù)越來(lái)越頻繁,也只好寫(xiě)點(diǎn)東西,以備后用。本文僅對(duì) Log4net 的使用做個(gè)簡(jiǎn)要說(shuō)明,所有涉及到擴(kuò)展和開(kāi)發(fā)的部分一概忽略。
使用 Log4net,需要熟悉的東東有 Logger、Appender 以及 Layout。Logger 是日志記錄器,我們使用其相關(guān)方法來(lái)完成日志記錄;Appender 用于設(shè)置日志的存儲(chǔ)方式和位置,Logger 的配置中會(huì)綁定一個(gè)或多個(gè) Appender;Layout 關(guān)聯(lián)具體的 Appender,用于設(shè)置日志字符串的格式。
1. Logger所有的記錄器都必須實(shí)現(xiàn) ILog 接口,該接口提供日志記錄所需的大量方法。
public interface ILog : ILoggerWrapper
{
void Debug(...);
void Error(...);
void Fatal(...);
void Info(...);
void Warn(...);
bool IsDebugEnabled { get; }
bool IsErrorEnabled { get; }
bool IsFatalEnabled { get; }
bool IsInfoEnabled { get; }
bool IsWarnEnabled { get; }
}
通常情況下,我們通過(guò) LogManager.GetLogger() 來(lái)獲取一個(gè)記錄器。LogManager 內(nèi)部維護(hù)一個(gè) hashtable,保存新創(chuàng)建 Logger 引用,下次需要時(shí)直接從 hashtable 獲取其實(shí)例。
ILog log = LogManager.GetLogger(this.GetType());
log.Debug("aaaaaaaaaaaaaaa");
所有 Logger 的參數(shù)設(shè)置都直接或間接繼承自 root,其繼承關(guān)系類(lèi)似 namespace。比如,名為 "MyLogger.X.Y" 參數(shù)設(shè)置繼承自 "MyLogger.X"。當(dāng)我們創(chuàng)建 "MyLooger.X.Y" 記錄器時(shí),會(huì)在配置文件找該名稱(chēng)的記錄器設(shè)置,如果沒(méi)找到,則按繼承關(guān)系向上查找,直到 root。因此,在創(chuàng)建 Logger 時(shí),我們通常使用類(lèi)型名稱(chēng)做為記錄器的名字,缺省情況下,它會(huì)使用 root 或某一個(gè)父配置,但在需要的時(shí)候,我們隨時(shí)可以為具體的類(lèi)型添加一個(gè)更加 "詳細(xì)" 的配置。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
</layout>
</appender>
<logger name="Learn.Library.Log4netTest">
<level value="ALL" />
</logger>
<root>
<level value="OFF" />
<appender-ref ref="Console" />
</root>
</log4net>
在創(chuàng)建 Logger 設(shè)置時(shí),需要注意 "level" 參數(shù)。Log4net 允許我們通過(guò)該參數(shù)調(diào)整日志記錄級(jí)別,只有高于或等于該級(jí)別的日志才會(huì)被記錄下來(lái)。比如在代碼調(diào)試階段,我們可能希望記錄所有的信息,而在部署階段,我們只希望記錄級(jí)別更高的錯(cuò)誤信息。這個(gè)參數(shù)的好處是允許我們?cè)诓恍薷拇a的前提下,隨時(shí)調(diào)整記錄級(jí)別。
(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)
"appender-ref" 參數(shù)用于綁定一個(gè)或多個(gè)具體的 Appender。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
2. Appender / LayoutLog4net 提供了大量的 Appender,最常用的包括 AdoNetAppender、AspNetTraceAppender、ConsoleAppender、FileAppender、OutputDebugStringAppender。每種 Appender 都有特定一些參數(shù),使用時(shí)直接從 《Log4net 手冊(cè)》的示例中拷貝過(guò)去,就OK了。(代碼摘自 Log4net 手冊(cè))
(1) AspNetTraceAppender<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
(2) ConsoleAppender<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
(3) OutputDebugStringAppender<appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
(4) FileAppender<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
有關(guān) Layout 詳細(xì)信息,請(qǐng)參考 Log4net 相關(guān)文檔,本文不做詳述。
3. ConfigurationLog4net 的配置方式十分靈活,即可以寫(xiě)到應(yīng)用程序配置文件中,也可以使用獨(dú)立配置文件。同時(shí)它還提供了監(jiān)測(cè)配置文件變化的功能,這樣我們隨時(shí)可以調(diào)整配置,而無(wú)須重啟應(yīng)用程序。
(1) 使用 app.config / web.configapp.config / web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
</root>
</log4net>
</configuration>
使用代碼初始化配置。
log4net.Config.XmlConfigurator.Configure();
(2) 使用自定義配置文件test.log4net
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
</root>
</log4net>
使用代碼初始化配置。
log4net.Config.XmlConfigurator.Configure(new FileInfo("test.log4net"));
使用 XmlConfigurator.ConfigureAndWatch() 方法除了初始化配置外,還會(huì)監(jiān)測(cè)配置文件的變化,一旦發(fā)生修改,將自動(dòng)刷新配置。
(3) XmlConfiguratorAttribute我們還可以使用 XmlConfiguratorAttribute 代替 XmlConfigurator.Config()/ConfigureAndWatch(),ConfiguratorAttribute 用于定義與 Assembly 相關(guān)聯(lián)的配置文件名。
方式1: 關(guān)聯(lián)到 test.log4net,并監(jiān)測(cè)變化。
[assembly: log4net.Config.XmlConfigurator(ConfigFile="test.log4net", Watch=true)]
方式2: 關(guān)聯(lián)到 test.exe.log4net (或 test.dll.log4net,文件名前綴為當(dāng)前程序集名稱(chēng)),并監(jiān)測(cè)變化。
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch=true)]