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
|
?
|
%
|
輸出一個
%
號
|
|