log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java的)姊妹工具.用过log4j的都知道,它功能强大,可配置性灵活,线程安全,对日志的输出管理和级别管理方便。具体的使用方法往下看。html
首先你应该下载log4net.dll并引入到你的项目References中,或者把源代码项目做为你工程的一部分加入到你的工程当中。单击这里下载Log4net 。web
使用log4net须要知道其中两个比较重要的概念:logger 和 appender。前者是日志记录对象,后者是日志记录的目标,包括控制台,文件,定量大小的文件,远程广播。也就是说咱们使用log4net的过程能够是这样的:得到一个用来记录日志的工具对象logger,而后为logger对象指定日志的记录位置.美妙的是,这一切工做均可以在Web.config配置文件中完成,所用的代码极少。安全
几乎全部的大型应用都会有本身的用于跟踪调试的API。由于一旦程序被部署之后,就不太可能再利用专门的调试工具了。然而一个管理员可能须要有一套强大的日志系统来诊断和修复配置上的问题。app
经验代表,日志记录每每是软件开发周期中的重要组成部分。它具备如下几个优势:它能够提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程当中就能生成并输出日志信息而无需人工干预。另外,日志信息能够输出到不一样的地方(控制台,文件等)以备之后研究之用。框架
Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。函数
用户要在本身的程序里加入日志功能,只需将log4net.dll引入工程便可。工具
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局)。布局
Logger是应用程序须要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先通过Layout的格式化处理后才会输出。性能
Logger提供了多种方式来记录一个日志消息,你能够在你的应用程序里建立多个Logger,每一个实例化的Logger对象都被log4net框架做为命名实体(named entity)来维护。这意味着为了重用Logger对象,你没必要将它在不一样的类或对象间传递,只须要用它的名字为参数调用就能够了。log4net框架使用继承体系,继承体系相似于.NET中的名字空间。也就是说,若是有两个logger,分别被定义为a.b.c和a.b,那么咱们说a.b是a.b.c的祖先。每个logger都继承了祖先的属性网站
Log4net框架定义了一个ILog接口,全部的logger类都必须实现这个接口。若是你想实现一个自定义的logger,你必须首先实现这个接口。你能够参考在/extension目录下的几个例子。
ILog接口的定义以下:
public interface ILog
{
void Debug(object message);
void Info(object message);
void Warn(object message);
void Error(object message);
void Fatal(object message);
//以上的每个方法都有一个重载的方法,用来支持异常处理。
//每个重载方法都以下所示,有一个异常类型的附加参数。
void Debug(object message, Exception ex);
// ...
//Boolean 属性用来检查Logger的日志级别
//(咱们立刻会在后面看到日志级别)
bool isDebugEnabled;
bool isInfoEnabled;
//… 其余方法对应的Boolean属性
}
Log4net框架定义了一个叫作LogManager的类,用来管理全部的logger对象。它有一个GetLogger()静态方法,用咱们提供的名字参数来检索已经存在的Logger对象。若是框架里不存在该Logger对象,它也会为咱们建立一个Logger对象。代码以下所示:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
一般来讲,咱们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪咱们正在进行日志记录的类。传递的类(class)的类型(type)能够用typeof(Classname)方法来得到,或者能够用以下的反射方法来得到:
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
尽管符号长了一些,可是后者能够用于一些场合,好比获取调用方法的类(class)的类型(type)。
正如你在ILog的接口中看到的同样,有五种不一样的方法能够跟踪一个应用程序。事实上,这五种方法是运做在Logger对象设置的不一样日志优先级别上。这几种不一样的级别是做为常量定义在log4net.spi.Level类中。你能够在程序中使用任何一种方法。可是在最后的发布中你也许不想让全部的代码来浪费你的CPU周期,所以,框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。
Level有如下几种取值
级别 |
容许的方法 |
Boolean属性 |
优先级别 |
OFF |
|
|
Highest |
FATAL |
void Fatal(...); |
bool IsFatalEnabled; |
|
RROR |
void Error(...); |
bool IsErrorEnabled; |
|
WARN |
void Warn(...); |
bool IsWarnEnabled; |
|
INFO |
void Info(...); |
bool IsInfoEnabled; |
|
DEBUG |
void Debug(...); |
bool IsDebugEnabled; |
|
ALL |
|
|
Lowest |
在log4net框架里,经过设置配置文件,每一个日志对象都被分配了一个日志优先级别。若是没有给一个日志对象显式地分配一个级别,那么该对象会试图从他的祖先继承一个级别值。
ILog接口的每一个方法都有一个预先定义好了的级别值。正如你在表1看到的,ILog的Inof()方法具备INFO级别。一样的,以此类推,Error()方法具备ERROR级别。当咱们使用以上的任何一种方法时,log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时,日志请求才会被接受并执行。
举例说明,当你建立了一个日志对象,而且把他的级别设置为INFO。因而框架会设置日志的每一个Boolean属性。当你调用相应的日志方法时,框架会检查相应的Boolean属性,以决定该方法能不能执行。以下的代码:
Logger.Info("message");
Logger.Debug("message");
Logger.Warn("message");
对于第一种方法,Info()的级别等与日志的级别(INFO),所以日志请求会被传递,咱们能够获得输出结果”message”。
对于第二种方法,Debug()的级别低于日志对象logger的日志级别(INFO),所以,日志请求被拒绝了,咱们得不到任何输出。一样的,针对第三行语句,咱们能够很容易得出结论。
在表1中有两个特殊的级别:ALL和OFF。ALL表示容许全部的日志请求。OFF是拒绝全部的请求。
你也能够显式地检查Logger对象的Boolean属性,以下所示:
if (logger.IsDebugEnabled)
{
Logger.Debug("message");
}
Repository主要用于负责日志对象组织结构的维护。在log4net的之前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,而且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,须要实现log4net.Repository.ILoggerRepository 接口。可是一般并非直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。
若是你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你须要用到LogManager类来自动管理库和日志对
一个好的日志框架应该可以产生多目的地的输出。好比说输出到控制台或保存到一个日志文件。log4net 可以很好的知足这些要求。它使用一个叫作Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你能够把多个Appender组件附加到一个日志对象上。 Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表能够在log4net框架的帮助手册中找到。有了这些现成的Appender组件,通常来讲你没有必要再本身编写了。可是若是你愿意,能够从log4net.Appender.AppenderSkeleton类继承。
先在web.config中的<configuration>节点下添加以下配置:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
还应该配置log4net节点,接下来在<configuration>节点下添加以下log4net节点配置:
<log4net>
<root>
<level value=" DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="c://log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]/r/n"/>
<param name="Footer" value="[Footer]/r/n"/>
<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="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
</log4net>
从上面的配置中能够看到定义了多个appender,每个appender就是一个日志记录的目标。root节点指定了选用哪个 appender. 在这里我选用了LogFileAppender。到这里配置就基本上完成了,可是怎么使用上面的配置呢?log4net为咱们提供了在应用程序启动时加载配置信息的入口,很简单,在Global.asax.cs的Application_Start过程当中添加以下代码:
log4net.Config.DOMConfigurator.Configure();
好了,到此为止整个配置过程完成了,下面是怎么调用的问题了
一、 关联配置文件
当咱们建立了上面的配置文件后,咱们接下来须要把它和咱们的应用联系起来。缺省的,每一个独立的可执行程序集都会定义它本身的配置。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对象做参数,以指出要打开的配置文件名。 这个方法和前面在程序集里设置属性打开一个配置文件的效果是同样的。
log4net.Config.DOMConfigurator.Configure( new FileInfo("TestLogger.Exe.Config"));
DOMConfigurator 类还有一个方法ConfigureAndWatch(..), 用来配置框架并检测文件的变化。
以上的步骤总结了和配置相关的各个方面,下面咱们将分两步来使用logger对象。
2 、建立或获取日志对象
日志对象会使用在配置文件里定义的属性。若是某个日志对象没有事先在配置文件里定义,那么框架会根据继承结构获取祖先节点的属性,最终的,会从根日志获取属性。以下所示: Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
三、 输出日志信息
可使用ILog的几种方法输出日志信息。你也能够在调用某方法前先检查IsXXXEnabled布尔变量,再决定是否调用输出日志信息的函数,这样能够提升程序的性能。由于框架在调用如ILog.Debug(…)这样的函数时,也会先判断是否知足Level日志级别条件。
if (log.IsDebugEnabled) log.Debug("message");
if (log.IsInfoEnabled) log.Info("message);
四、 在程序中配置log4net
除了前面讲的用一个配置文件来配置log4net之外,还能够在程序中用代码来配置log4net框架。以下面的例子:
// 和PatternLayout一块儿使用FileAppender
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.FileAppender(
new log4net.Layout.PatternLayout("%d
[%t]%-5p %c [%x] - %m%n"),"testfile.log"));
// using a FileAppender with an XMLLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.FileAppender(
new log4net.Layout.XMLLayout(),"testfile.xml"));
// using a ConsoleAppender with a PatternLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.ConsoleAppender(
new log4net.Layout.PatternLayout("%d
[%t] %-5p %c - %m%n")));
// using a ConsoleAppender with a SimpleLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.ConsoleAppender(new
log4net.Layout.SimpleLayout()));
尽管这里用代码配置log4net也很方便,可是你却不能分别配置每一个日志对象。全部的这些配置都是被应用到根日志上的。
log4net.Config.BasicConfigurator 类使用静态方法Configure 设置一个Appender 对象。而Appender的构造函数又会相应的要求Layout对象。你也能够不带参数直接调用BasicConfigurator.Configure(),它会使用一个缺省的PatternLayout对象,在一个ConsoleAppender中输出信息。以下所示:
log4net.Config.BasicConfigurator.Configure();
在输出时会显示以下格式的信息:
0 [1688] DEBUG log1 A B C - Test
20 [1688] INFO log1 A B C - Test
当log4net框架被配置好之后,就能够如前所述使用日志功能了。
新建一个log4nettest.aspx页面,在cs文件中添加引用 using log4net;定义本页的一个全局变量:private static readonly ILog log = LogManager.GetLogger(typeof(log4nettest));
而后在Page_Load中添加以下代码:log.Debug("这是我在使用Log4Net");运行该页面,在C:/下面会生成一个c://log-file.tx文本文件,打开看看,里面就有你写入的日志。
在Global.asax添加以下的内容:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
log4net.Config.DOMConfigurator.Configure();
}
实例
简单的使用步骤:
1。下载log4net.dll,并在项目中引用。
2。配置log4net.xml,想要根据具体要求修改的话,请参照文献查找各个参数的含义。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <log4net> <!-- Define some output appenders --> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <param name="File" value="log-file.txt" /> <!-- Example using environment variables in params --> <!-- <param name="File" value="${TMP}//log-file.txt" /> --> <param name="AppendToFile" value="true" /> <!-- An alternate output encoding can be specified --> <!-- <param name="Encoding" value="unicodeFFFE" /> --> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header]/r/n" /> <param name="Footer" value="[Footer]/r/n" /> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <!-- Alternate layout using XML <layout type="log4net.Layout.XMLLayout" /> --> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> <!-- <appender-ref ref="A" /> --> </root> <!-- Specify the level for some specific categories --> <logger name="SLog4net.Form1"> <!-- <appender-ref ref="B" /> --> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> </logger> </log4net> </configuration>
记得:若是是web程序要将log4net.xml放到根目录下面,若是是winform要将log4net.xml放到启动目录下面。
3.在项目的AssemblyInfo .cs中添加
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.xml", Watch = true)]
4.在类中调用。
新建一个Form1的Windows窗体,在cs文件中添加引用 using log4net;定义本页的一个全局变量:private static readonly ILog log = LogManager.GetLogger(typeof(Form1));
而后在Page_Load中添加以下代码:log.Debug("这是我在使用Log4Net");运行该页面,在项目下面会生成一个log-file.txt文本文件,打开看看,里面就有你写入的日志。