Log4net 簡明手冊(來自yuhen,寫的非常好)

常見面,卻不怎麼用,究其原因還是覺得太複雜了點。不過,這東西出現次數越來越頻繁,也只好寫點東西,以備後用。本文僅對 Log4net 的使用做個簡要說明,所有涉及到擴展和開發的部分一概忽略。

使用 Log4net,需要熟悉的東東有 Logger、Appender 以及 Layout。Logger 是日誌記錄器,我們使用其相關方法來完成日誌記錄;Appender 用於設置日誌的存儲方式和位置,Logger 的配置中會綁定一個或多個 Appender;Layout 關聯具體的 Appender,用於設置日誌字符串的格式。

1. Logger

所有的記錄器都必須實現 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; }
}

通常情況下,我們通過 LogManager.GetLogger() 來獲取一個記錄器。LogManager 內部維護一個 hashtable,保存新創建 Logger 引用,下次需要時直接從 hashtable 獲取其實例。
ILog log = LogManager.GetLogger(this.GetType());
log.Debug("aaaaaaaaaaaaaaa");

所有 Logger 的參數設置都直接或間接繼承自 root,其繼承關係類似 namespace。比如,名爲 "MyLogger.X.Y" 參數設置繼承自 "MyLogger.X"。當我們創建 "MyLooger.X.Y" 記錄器時,會在配置文件找該名稱的記錄器設置,如果沒找到,則按繼承關係向上查找,直到 root。因此,在創建 Logger 時,我們通常使用類型名稱做爲記錄器的名字,缺省情況下,它會使用 root 或某一個父配置,但在需要的時候,我們隨時可以爲具體的類型添加一個更加 "詳細" 的配置。
<?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>


在創建 Logger 設置時,需要注意 "level" 參數。Log4net 允許我們通過該參數調整日誌記錄級別,只有高於或等於該級別的日誌纔會被記錄下來。比如在代碼調試階段,我們可能希望記錄所有的信息,而在部署階段,我們只希望記錄級別更高的錯誤信息。這個參數的好處是允許我們在不修改代碼的前提下,隨時調整記錄級別。
(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)

"appender-ref" 參數用於綁定一個或多個具體的 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 / Layout

Log4net 提供了大量的 Appender,最常用的包括 AdoNetAppender、AspNetTraceAppender、ConsoleAppender、FileAppender、OutputDebugStringAppender。每種 Appender 都有特定一些參數,使用時直接從 《Log4net 手冊》的示例中拷貝過去,就OK了。(代碼摘自 Log4net 手冊)

(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>

有關 Layout 詳細信息,請參考 Log4net 相關文檔,本文不做詳述。

3. Configuration

Log4net 的配置方式十分靈活,即可以寫到應用程序配置文件中,也可以使用獨立配置文件。同時它還提供了監測配置文件變化的功能,這樣我們隨時可以調整配置,而無須重啓應用程序。

(1) 使用 app.config / web.config

app.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() 方法除了初始化配置外,還會監測配置文件的變化,一旦發生修改,將自動刷新配置。

(3) XmlConfiguratorAttribute

我們還可以使用 XmlConfiguratorAttribute 代替 XmlConfigurator.Config()/ConfigureAndWatch(),ConfiguratorAttribute 用於定義與 Assembly 相關聯的配置文件名。

方式1: 關聯到 test.log4net,並監測變化。
[assembly: log4net.Config.XmlConfigurator(ConfigFile="test.log4net", Watch=true)]

方式2: 關聯到 test.exe.log4net (或 test.dll.log4net,文件名前綴爲當前程序集名稱),並監測變化。
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net", Watch=true)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章