Logger hierarchy(層次級別)
Logger都是已經命名的實體。Logger的名稱區分大小寫並遵循以下規則:
1 如果A logger的名稱如果是B logger名稱的前綴(通過“.”連接),則說A logger是B logger的祖父級。
2 如果A logger的名稱和B logger的名稱之間不存在其他的logger名稱,則A logger是B logger的父級。
例子:A logger名稱爲“Foo.Bar”,B logger名稱爲“Foo.Bar.Baz”,A爲B的父級。名稱爲“System”的logger是名稱爲“System.Text.StringBuilder”的祖父級。
Root logger位於logger層次級別中的頂級。它有例外的三條規則:
1 Root logger總是存在的。
2 Root logger不能通過名稱或取。
3 Root logger 有一個默認的Level 值爲 Debug。
Logger 可以通過log4net.LogManager類的靜態方法GetLogger獲取。
Level值:ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF
Level 繼承規則:如果一個logger沒有定義Level,它的Level值將從它的父級(定義了Level)繼承。
日誌紀錄請求通過調用logger實例的輸出方法實現。這些輸出方法有Debug,Info,Warn,Error和Fatal。
通過定義,輸出方法決定了日誌紀錄請求的Level。例如,log是一個logger實例,那麼語句log.Info(“..”)的日誌紀錄請求Level爲INFO。
如果日誌紀錄請求的Level比logger本身定義(或繼承)的Level高,則請求是可行的,否則不可行。
簡單規則:如果日誌記錄請求的Level爲L,logger本身定義(或繼承)Level爲K,當L>=K時,日誌紀錄請求是可行的。
Level級別:DEBUG <INFO<WARN<ERROR<FATAL
通過名稱,調用log4net.LogManager.GetLogger方法,可以獲取同一個logger的實例引用。這樣在配置了一個logger後,不用在代碼中傳遞引用而可以獲取同一個logger的引用了。與生物上的親子關係(父親總是先於孩子)基本相反,在log4net 裏,logger可以被創建和配置成任何順序。特別的是,一個父級logger可能比子級logger後實例化,但卻可以在子級中查找到。
Appender
Log4net允許日誌以不同的方式輸出,如:ms sql、文件、控制檯或者系統日誌等等。
一個logger可以有多個Appender。每一個可行的日誌紀錄請求將輸出到所有的appender,這些appender是在當前這個logger中引用的,還包括父級logger中引用的。換句話說,appender將在logger的層次級別中添加性的繼承。例如在root中定義了一個Console appender,那麼所有的logger至少有一個Console appender。如果 A logger有一個File appender,則 A logger以及它的子logger都有兩個appender。
Additivity屬性默認爲true,當設置爲false時,appender將採用覆蓋的方式,而不再從父級logger中繼承。
Filters是用來過濾appender能接受的日誌信息。
使用以下filter的appender只接受Level從INFO到FATAL之間的日誌紀錄請求。
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="FATAL" />
</filter>
使用以下filter的appender只接受包含子串爲“database”的日誌紀錄。
<filter type="log4net.Filter.StringMatchFilter">
<param name="StringToMatch" value="database" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
第一個filter將會在日誌紀錄信息中查找“database”,如果找到則不再匹配下面得filter,appener接受並紀錄該日誌。如果沒有找到則繼續使用第二個filter,該filter將拒絕任何日誌信息。
Layouts 用來定製輸出格式。
加載配置
ConfigFile屬性:當我們自己定義了一個log4net的配置文件時,可以通過這個屬性來指定配置文件。
ConfigFileExtension屬性:當應用程序會編譯成不同擴展名稱的程序集時,可以使用這個屬性。如Sample程序將編譯成Sample.exe,則ConfigFileExtension設置爲“config”,那麼所使用的配置文件名稱爲:Sample.exe.config。注意不能和ConfigFile屬性同時使用。
Watch屬性:在運行期間是否監測配置文件。當值爲true時,FileSystemWatcher將用來監視配置文件的內容改變、重命名和刪除通知。
爲應用程序加載log4net的配置,可以通過在應用程序集中設置屬性。
例如:
[assembly: log4net.Config.DOMConfigurator(ConfigFile="Sample.config")]
[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension="config")]
也可以不使用任何參數,這時將使用應用程序的配置文件。
[assembly: log4net.Config.DOMConfigurator()]
另一種方式是在代碼中使用 DOMConfigurator 類
log4net.Config.DOMConfigurator.Configure(
new FileInfo("TestLogger.Exe.Config"));
使用ConfigureAndWatch(..)可以指定一個配置文件並且監視該文件的變化。
PatternLayout
每一種指定的轉換符號都以%開始,後面跟着一個可選的格式符號和一個轉換符號。轉換符號用來指定輸出的數據類型,如Level,logger,date等。
例如:轉換模型“%-5p [%t]: %m%n”
ILog log = LogManager.GetLogger(typeof(TestApp));
log.Debug("Message 1");
log.Warn("Message 2");
轉換後:
DEBUG [main]: Message 1
WARN [main]: Message 2
“%-5p”表示輸出日誌紀錄請求的Level值,寬度爲5個子符,並左對齊。
轉換符號列表:
a
輸出創建日誌的AppDomain的名稱
c
默認輸出logger的全名稱。後面可跟“{數字}”,則表示輸出與數字對應的logger名稱級別(從右邊開始)。如全名爲“a.b.c”,“%c{2}”輸出“b.c”
C
輸出調用日誌紀錄請求的類名。後面可跟“{數字}”,表示輸出與數字對應的類名稱(包含命名空間,從右邊開始)。
d
輸出日誌記錄時間,後可跟“{時間格式}”。默認爲yyyy-MM-dd HH:mm:ss,fff
F
輸出調用日誌紀錄請求的文件全名。(會影響速度)
l
輸出調用日誌紀錄請求的一些本地信息。如類和成員名,調用文件和調用聲明的代碼行數。(極其影響性能)
L
輸出調用日誌紀錄請求的聲明代碼行數。(極其影響性能)
m
輸出應用程序所要輸出的信息。
M
輸出調用日誌紀錄請求的成員名稱。(極其影響性能)
n
輸出換行符號
p
輸出日誌請求的Level值
P
r
輸出從應用程序啓動開始到日誌紀錄請求的時間(毫秒)
t
輸出產生日誌的線程名稱,如果沒有名稱則輸出線程的編號
u
輸出當前活動用戶的名稱。(Principal.Identity.Name)
W
輸出當前活動用戶的windows標識。
x
X
%
輸出一個%號