使用 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)]