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