Log4net
配置学习
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
%
输出一个 % 号