Log4net学习心得
最近在学习log4net,下面是我的一些学习心得,把它写下来与大家分享一下。
1、 Log4net概述:
log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2010的WPF项目中使用log4net快速创建系统日志。
2、 Log4net详解:
2.1 log4net的组成。
log4net主要由Logger、Appender、Repository、Layout和Filter组成。
1)Logger
Logger是log4net主要部分,该元素预定义了一个具体日志对象的设置,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:
LogManager.GetLogger(LogName)在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。
2)Appender
Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。Appender节点是可以有一种或多种的。
3)Repository
Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。
4)Layout
Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
每个Appender节点里面只能有一个Layout节点。
5)Filter
在Appender元素里的filter标签。它定义了应用到Appender对象的过滤器。本例中,我们使用了LevelRangeFilter过滤器,它可以只记录LevelMin和LevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器(Filter),这些过滤器将会按照它们定义的顺序对日志事件进行过滤。
2.2 log4net消息的级别:
消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。
只有当方法的级别高于日志级别时,日志请求才会被接受并执行。举例说明,当你创建了一个日志对象,并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时,框架会检查相应的Boolean属性,以决定该方法能不能执行。如下的代码:
Logger.Info("message");
Logger.Debug("message");
Logger.Warn("message");
对于第一种方法,Info()的级别等与日志的级别(INFO),因此日志请求会被传递,我们可以得到输出结果”message”。
对于第二种方法,Debug()的级别低于日志对象logger的日志级别(INFO),因此,日志请求被拒绝了,我们得不到任何输出。同样的,针对第三行语句,我们可以很容易得出结论:仍然得不到任何输出。
另外还有两个特殊的级别:ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。
3、 Log4net应用:
3.1 下载log4net.dll文件。
下载地址:http://logging.apache.org/log4net/。
3.2 在应用程序进行相关配置。
1)首先需要在程序集级别的文件中(AssemblyInfo.cs)修改配置。无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:
[assembly: log4net.Config .XmlConfigurator()]
或者:[assembly:log4net.Config.XmlConfigurator(ConfigFile="filename",ConfigFileExtension="txt",Watch=true)]
{注释:
ConfigFile 如果指定,XmlConfigurator将使用该配置文件,文件的路径是相对应用项目的根目录(AppDomain.CurrentDomain.BaseDirectory),也可以是绝对路径。该属性不能与“ConfigFileExtension”属性一起使用。
ConfigFileExtension 如果指定,将对配置文件进行扩展。程序集的名字将追加到扩展文件名里,作为基本的名字。例如,如果程序集是从TestApp.exe文件中加载,并且log4net设置了ConfigFileExtension属性,则配置文件的名字是“TestApp.exe.log4net”,这相当于给TestApp.exe.log4net设置了ConfigFile属性。
配置文件将编译输出到项目根目录(AppDomain.CurrentDomain.BaseDirectory),程序集名和配置文件扩展名就是该配置的名字。
这个属性不能与ConfigFile属性一起使用。
Watch 如果指定并设置为“True”,那么框架将监视配置文件,每次配置修改将重新加载。
如果既没有指定ConfigFile, 也没有指定ConfigFileExtension,项目默认配置文件(例如:TestApp.exe.config)将作为log4net的配置文件。}
2)在配置文件中修改配置。
如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样。模式如下:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogAllToFile" />
<appender-ref ref="AdoNetAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header] "/>
<param name="Footer" value="[Footer] "/>
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=.;Initial Catalog=HJRightPlat;User ID=sa;Password=123456" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net>
{注释:
所有的配置都要在<log4net>元素里定义。
<log4net>支持的属性:
debug 可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。
update 可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库
threshold 可选,取值是repository(库)中注册的level,默认值是ALL。
支持的子元素:appender 1或多个、logger 0或多个、renderer 0或多个 root 最多一个、param 0或多个。
<root>
实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性。支持的子元素:appender-ref 0个或多个,要引用的appender的名字、level最多一个。 只有在这个级别或之上的事件才会被记录、param 0个或多个, 设置一些参数。
在root的appender-ref子元素中,必须指定它要输出的appender。否则日志不会输出到该appender指定的目的地。
<logger>
支持的属性:name 必须的,logger的名称、additivity可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender
支持的子元素:appender-ref 0个或多个,要引用的appender的名字、level最多一个。 只有在这个级别或之上的事件才会被记录、param0个或多个,设置一些参数。
<appender>
定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。
支持的属性:name 必须的,Appender对象的名称、type 必须的,Appender对象的输出类型
支持的子元素:appender-ref 0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持、filter 0个或多个,定义此app使用的过滤器、layout 最多一个。定义appender使用的输出格式、param 0个或多个,设置Appender类中对应的属性的值。
Appender有多种输出方式:
1 AdoNetAppender
将日志记录到数据库中。可以采用SQL和存储过程两种方式。
2 AnsiColorTerminalAppender
在ANSI 窗口终端写下高亮度的日志事件。
3 AspNetTraceAppender
能用asp.net中Trace的方式查看记录的日志。
4 BufferingForwardingAppender
在输出到子Appenders之前先缓存日志事件。
5 ConsoleAppender
将日志输出到控制台。
6 EventLogAppender
将日志写到Windows Event Log.
7 FileAppender
将日志写到文件中。
8 TraceAppender
将日志写到.NET trace 系统。
9 MemoryAppender
将日志存到内存缓冲区。
10 NetSendAppender
将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
11 RemoteSyslogAppender
通过UDP网络协议将日志写到Remote syslog service。
12 RemotingAppender
通过.NET Remoting将日志写到远程接收端。
13 RollingFileAppender
将日志以回滚文件的形式写到文件中。
14 SmtpAppender
将日志写到邮件中。
<layout>
布局,只能作为<appender>的子元素。
支持的属性:type必须的,Layout的类型
支持的子元素:param 0个或多个,设置一些参数
<filter>
过滤器,只能作为<appender>的子元素。
支持的属性:type必须的,Filter的类型
支持的子元素:param 0个或多个,设置一些参数
}
3.3 在应用程序进行应用日志文件。
1)获取日志记录器。有三种方法:
private static log4net.ILog oldLog = LogManager.GetLogger("testApp.Logging");
private static log4net.ILog logger = LogManager.GetLogger(typeof(Program));
private static readonly log4net.ILog logs = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
2)写入日志
logs.Error("Error Acc logs");
logs.Warn("Warn Acc logs");
logs.Info("Info Acc logs");
logs.Debug("Debug Acc logs");
logger.Error("Error Acc logger");
logger.Warn("Warn Acc logger");
logger.Info("Info Acc logger");
logger.Debug("Debug Acc logger");
oldLog.Error("Error Acc oldLog");
oldLog.Warn("Warn Acc oldLog");
oldLog.Info("Info Acc oldLog");
oldLog.Debug("Debug Acc oldLog");
不过由于本例中只配置了两个Apperder(LogFileAppender和AdoNetAppender)
所以日志只能保存到log-file.txt文件和数据库中。