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
|
|
%
|
输出一个
%
号
|
|