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