1、插件背景与功能
Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。
Log4net可以从http://logging.apache.org/log4net/downloads.html网站下载最新版本,引用log4net.dll组件,从你下载下来的src目录log4net.sln文件生成后便会自动编译log4net.dll文件了.
记录日志的分类:Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制台,文件,事件日志(可以用事件查看器查看)和邮件等多种方式。
日志的级别:Log4net支持多种级别的日志。优先级从高到低依次排列如下:FATAL > ERROR > WARN > INFO > DEBUG,此外还有ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求)这两种特殊的级别。
2、插件使用
Log4net.dll有多个版本,通常我们现在常用的有1.20.10与1.20.13版的。两个版本在应用程序的配置文件中的section节点的配置有差异,针对每个版本详细配置请百度,谷歌查询。
A.插件的配置
下面我介绍下1.20.13最新版的log4net.dll的配置与使用。
首先,在项目中添加log4net.dll的引用
引入完成后,需要在Web.Config文件中配置log4net的切入点与日志的输出配置,日志的输出分为很多种,常见的输出方式可以分类为文件形式的输出,数据库形式的输出,邮件形式的输出。
下面我来介绍下文件形式的输出,与数据库形式的输出配置。
在Web.Config->configuration->configSections 节点下添加Log4net的配置块:
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
然后在Configuration节点下配置log4net的详细配置如下:
<log4net>
<!-- 文件输出 -->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="Logs\log-file.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<header value="[Header]" />
<footer value="[Footer]" />
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
</layout>
</appender>
<!--数据库输出-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=LITIANYUAN;initial catalog=tempdb;integrated security=false;persist security info=True;User ID=sa;Password=sasasa" />
<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>
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
</root>
<!-- Specify the level for some specific categories -->
<logger name="ConsoleApp" additivity="false">
<!-- <appender-ref ref="B" /> -->
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
</logger>
</log4net>
在上面的配置中,appender节点决定日志输出的方式。root节点是配置默认的日志方式,logger节点是配置其他的日志输出方式,默认是继承Root,如果想logger方式中不继承root,则在logger节点上配置一个属性additivity=”false”即可。如果是数据库输出方式,请参考log4net官网中在数据库中建立对应的表结构。
B.插件的使用
在研究中发现Log4net使用时注入有两种方式:
1、应用程序注入:
查看网上资料后发现,当我们创建了上面的配置文件后,我们接下来需要把它和我们的应用联系起来。缺省的,每个独立的可执行程序集都会定义它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。
可以在项目的AssemblyInfo.cs文件里添加以下的语句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)]
ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。
其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”
ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名,例如,应用程序的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt” ;
也可以不带参数应用DOMConfiguratio():
[assembly: log4net.Config.DOMConfigurator()]
也可以在程序代码中用DOMConfigurator类打开配置文件。类的构造函数需要一个FileInfo对象作参数,以指出要打开的配置文件名。 这个方法和前面在程序集里设置属性打开一个配置文件的效果是一样的。
2、命名空间注入:
在需要使用的地方的命名空间(namaspace)上注入log4net的配置。
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Mvc1.Controllers
{
}
这样也可以达到注入的效果。
两种方式都试验过,都没问题。Log4net的配置注入只需要一次就完成,其他地方使用则不需要重复注入就可以直接使用。
初始化Loger
ILoglogger=log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
GetLogger参数可以是当前应用程序的位置。
如果参数是配置文件中Logger节点的Name,则是使用不同的loger输出方式来初始话loger。
调用方式如下,分别对应的是每种不同级别的日志:
logger.Debug("测试------------->");
logger.Debug("调用RegisterStartupScript()方法");
logger.Debug("调试");
logger.Error("这是一个错误日志");
logger.Fatal("这是一个致命的错误日志");
logger.Warn("这是一条警告日志");
logger.Info("这是一条普通信息");
到此位置整个的配置和使用过程已经结束了。可以找到之前配置的文件日志或者数据库日志表,进行查看日志信息。
3、总结
使用log4net可以很方便地为应用添加日志功能。应用Log4net,使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。