日志部分在程序中占了4%,有利于帮助我们很快地得到我们需要的调试信息,找到问题的根源尽快解决问题,从而降低我们的维护成本。这几天一直断断续续地学习Log4net部分,由于知道自己在一个比较长的时间必须去使用.net的部分(HA Project and LIS Project),没办法,只有硬着头皮死肯:),不过也让我见识不少呢!log4net是appache开源的一个杰作,和log4J很相象,如同孪生的兄弟一样,基本的概念原理都是一样的,她主要应用在.net上的。下面是我一些收集的资料,同时也是我在开发过程中的一些经验总结。稍后也会把一些实际项目的经验记录下来,和使用Log4J的相关内容。
Log4net 主要有四个组件。分别是Logger(记录器),Repository(库),Appender(附着器)和Layout(布局)。
Logger
定义与用途:
Logger
是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过
Layout
的格式化处理后才会输出。
Root
是一个默认的
Logger
,当一个
root
和
Logger
内容配置一致的时候就会记录两条相同的记录,当在配置文件中找不到
logger
的名字时候,就会使用root的配置。
Repository
定义与用途:
Repository
主要用于负责日志对象组织结构的维护。现在 已经使用LogManager类来维护日志对象组织。
Appender
定义及用途:
定义输出介质,可以把多个
Aappender
附加到一个日志对象中, 一个Appender对象缺省地把所有的日志事件传递到输出流中,我们可以通过Aappender Filters来过滤剩下我们需要的部分。分别有级别过滤(定义级别区间),字符串过滤,可以定义多个filter。such as :LevelMatchFilter、LevelRangeFilter、MDCFilter、NDCFilter、 StringMatchFilter.
Layout
定义与用途
Layout
组件用于向用户显示最后经过格式化的输出信息。可以是线性的或一个
XML
文件。
Layout
组件和一个
Appender
组件一起工作。也就是说一个
appender
对象
只能对应一个
layout
对象。
Log4net DEBUG
信息分级:
一共有七级
级别
允许方法
Boolean
属性
优先级别
OFF
(拒绝所有的日志请求)
FATAL ERROR
null void Fatal(...); void Error(...);
null bool IsFatalEnabled; bool IsErrorEnabled;
Highest second three
WARN INFO DEBUG
void Warn(...); void Info(...); void Debug(...);
bool IsWarnEnabled; bool IsInfoEnabled; bool IsDebugEnabled;
four five six
ALL
(允许所有的日志请求)
Null
Null
Lowest
Log4net
配置方式:
1.
在单独文件里配置(推荐):改变配置不需要重新编译代码,同时也可以在程序运行的过程中修改代码。
2.
在程序代码中配置
关联配置文件:
log4net
框架使用
log4net.Config.DOMConfiguratorAttribute
log4net.Config.XmlConfigurator
在程序集的级别上定义配置文件。方法有多种的:
1
.可以在项目的
AssemblyInfo.cs
文件里添加以下的语句
[assembly:log4net.Config.XmlConfigurator(ConfigFile="filename",
ConfigFileExtension="ext",Watch=true/false)]
其中
configFile
设定了配置文件的文件名,路径,扩展名
configFileExtension
设定了被编译的文件使用扩展名字,默认为
config
但是configFileExtension与configFile不能同时使用。在这里我们可以关联我们手动配置的文件,而不使用.net给我们的应用程序配置文件。
eg:
[assembly:log4net.Config.DOMConfigurator(ConfigFile="/Projects/Regular/bin/config/App.log.conf.xml",Watch=true)]
2
.可以不带参数应用
DOMConfiguratio():
[assembly: log4net.Config.DOMConfigurator()]
3.
也可以在程序代码中用
DOMConfigurator
类打开配置文件。类的构造函数需要一个
FileInfo
对象作参数,以指出要打开的配置文件名。
log4net.Config.DOMConfigurator.Configure(
new FileInfo("TestLogger.Exe.Config"));
创建日志对象:
当日志对象没有在配置文件中定义的话,就会使用
root
的祖父节点。
Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
输出日志信息:
可以使用输出日志的几种方式:fatal();error();warn();info();debug();
if (log.IsDebugEnabled) log.Debug("message");
DEBUG
输出格式的意义:
Eg
:
<param name="ConversionPattern"
value="%d [%t] %-5p %c [%x] - %m%n"
/>
%m(message):
输出的日志消息,如
ILog.Debug(
…
)
输出的一条消息
%n(new line):
换行
%d(datetime):
输出当前语句运行的时刻
%r(run time):
输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):
当前语句所在的线程
ID
%p(priority):
日志的当前优先级别,即
DEBUG
、
INFO
、
WARN
…等
%c(class):
当前日志对象的名称,例如:
模式字符串为:
%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L
:输出语句所在的行号
。包括类目名、发生的线程,以及在代码中的行数。
%F
:输出语句所在的文件名
%-
数字:表示该项的最小长度,如果不够,则用空格填充
例如,转换模式为
%r [%t]%-5p %c - %m%n
的
PatternLayout
将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
(未完待续)