由于最近在WinForm项目中用到log4net便查阅了相关资料。但发现关于log4net的文章很多,但说的太简陋了,经过实践后现把总结一下。内容如下:
1.log4net的介绍
log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java的)姊妹工具.用过log4j的都知道,它功能强大,可配置性灵活,线程安全,对日志的输出管理和级别管理方便。使用log4net需要知道其中两个比较重要的概念:logger 和 appender。前者是日志记录对象,后者是日志记录的目标载体,包括控制台,文件,定量大小的文件,远程广播。log4net的工作原理简单地说是这样的:获得一个用来记录日志的工具对象logger,然后为logger对象指定日志的记录位置。值得一提的是这一切工作都可以在应用程序的配置文件中完成,所需代码量极少。
2.配置文件说明
简单的拿一个配置文件来举例说明:--后边的文字表示注释内容
<configuration>
<configSections> --在配置选项中加入log4net的引用
<section type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender >LogFile" type="log4net.Appender.RollingFileAppender,log4net" >
<param value="log.txt" /> --定义用文件来保存日志,生成的文件log.txt和应用程序生成的exe文件在同一目录下。
<param value="false" />
<param value="Date" />
<param value="yyyy.MM.dd" />
<param value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">--定义输出风格
<param value="%d [%t] %-5p %c - %m%n" />
<param value=" ----------------------header-------------------------- " />
<param value=" ----------------------footer-------------------------- " />
</layout>
</appender>
<appender>
--一个配置文件可以有很多appender,一个appender节就相当于一个日志输出介质或方法。
</appender>
<logger >logApp"> --定义logger对象的名字为logApp,以方便在代码中使用,<logger>配置项可以不配置
<level value="ALL" />--定义输出的信息等级为所有其中包括Fatal.Error.Warn.Info.Debug
</logger>
<root>--定义日志输出的方式和等级
<level value="INFO" />
<appender-ref ref="LogFile" />--选择了文件输出,注意粗体部分对应的名称
</root>
</log4net>
</configuration>
3.Log4net的使用。
使用步骤:
- 在项目中添加log4net.dll的引用。
- 关联配置文件。
- 创建Ilog实例,便可以使用了。
说明:关联配置文件一般是通过在AssemblyInfo.cs文件里添加以下的语句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)] 参数可以省略
ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。可省略
ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名 ,删除等事件。
创建实例的方法:
Log4net框架定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。如:ILog log = LogManager.GetLogger("logApp") //logApp是配置文件中<logger>定义的name属性值。
我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得。
如:ILog log = LogManager.GetLogger(this.GetType())//this.GetType()只限于部分地方可以这样写,最好用typeof(classname)。
最后就可以使用创建后的实例了。如:log.Info("执行××××方法开始"), log.Error("****")等
到此你就可以轻松使用log4net了,下一篇会给出一些配置信息的详细说明。欢迎大家提出建议。
介绍一下各配置信息
1.Appenders
Appenders用来定义日志的输出方式。它还可以通过配置Filters和Layout来实现日志的过滤和输出格式。
它的输出方式有:
- AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。
- AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。
- AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。
- BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。
- ConsoleAppender 将日志输出到应用程序控制台。
- EventLogAppender 将日志写到Windows Event Log。
- FileAppender 将日志输出到文件。
- RollingFileAppender 将日志以回滚文件的形式写到文件中。
- ForwardingAppender 发送日志事件到子Appenders。
- LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下)。
- MemoryAppender 将日志存到内存缓冲区。
- NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
- OutputDebugStringAppender 将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。
- RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。
- RemotingAppender 通过.NET Remoting将日志写到远程接收端。
- SmtpAppender 将日志写到邮件中。
- SmtpPickupDirAppender 将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。
- TelnetAppender 客户端通过Telnet来接受日志事件。
- TraceAppender 将日志写到.NET trace 系统。
- UdpAppender 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。
共20种,使用时主要体现在type属性上 如 <appender type="log4net.Appender.RollingFileAppender,log4net" /> <appender type="log4net.Appender.ConsoleAppender,log4net" >。注意加粗部分。具体使用哪种方式就要看具体需求了。
2. Layouts
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。一个Appender只能有一个Layout。下面以列表的格式来给出具体的说明。
表示式 | 含义 |
---|---|
a | 等价于appdomain |
appdomain | 引发日志事件的应用程序域的友好名称。(我在使用中一般是可执行文件的名字。) |
c | 等价于 logger |
C | 等价于 type |
class | 等价于 type |
d | 等价于 date |
date | 发生日志事件的本地时间。 使用 日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。 另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。 它们的性能要好于ToString。 |
exception | 异常信息 日志事件中必须存了一个异常对象,如果日志事件不包含没有异常对象,将什么也不输出。异常输出完毕后会跟一个换行。一般会在输出异常前加一个换行,并将异常放在最后。 |
F | 等价于 file |
file | 发生日志请求的源代码文件的名字。 警告:只在调试的时候有效。调用本地信息会影响性能。 |
identity | 当前活动用户的名字(Principal.Identity.Name). 警告:会影响性能。(我测试的时候%identity返回都是空的。) |
l | 等价于 location |
L | 等价于 line |
location | 引发日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。 警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。 |
level | 日志事件等级 |
line | 引发日志事件的行号 警告:会影响性能。 |
logger | 记录日志事件的Logger对象的名字。 可以使用精度说明符控制Logger的名字的输出层级,默认输出全名。 注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c", 输出模型为 %logger{2} ,将输出"b.c"。 |
m | 等价于 message |
M | 等价于 method |
message | 由应用程序提供给日志事件的消息。 |
mdc | MDC (旧为:ThreadContext.Properties) 现在是事件属性的一部分。 保留它是为了兼容性,它等价于 property。 |
method | 发生日志请求的方法名(只有方法名而已)。 警告:会影响性能。 |
n | 等价于 newline |
newline | 换行符 |
ndc | NDC (nested diagnostic context) |
p | 等价于 level |
P | 等价于 property |
properties | 等价于 property |
property | 输出事件的特殊属性。例如: %property{user} 输出user属性。属性是由loggers或appenders添加到时间中的。 有一个默认的属性" %property将输出所以的属性 。 (我除了知道可以用它获得主机名外,还不知道怎么用。) |
r | 等价于 timestamp |
t | 等价于 thread |
timestamp | 从程序启动到事件发生所经过的毫秒数。 |
thread | 引发日志事件的线程,如果没有线程名就使用线程号。 |
type | 引发日志请求的类的全名。. 可以使用精度控制符。例如: 类名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1} 将输出"PatternLayout"。(也是从右开始的。) 警告:会影响性能。 |
u | 等价于 identity |
username | 当前用户的WindowsIdentity。(类似:HostName\Username) 警告:会影响性能。 |
utcdate | 发生日志事件的UTC时间。 日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。 另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如: %date{ISO8601}或%date{ABSOLUTE}。 它们的性能要好于ToString。 |
w | 等价于 username |
x | 等价于 ndc |
X | 等价于 mdc |
% | %%输出一个百分号 |
其它的一些配置信息就不多说了。
总结:个人建议最好不要直接使用log4net,我们可以通过Common.Logging.dll提供接口来使用log4net。毕竟接口的灵活性要比类高。