频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
Log4net简介
2019-12-16 10:14:10         来源:zaichuanguanshui的专栏  
收藏   我要投稿

一、概述

1、log4net是.Net下一个非常优秀的开源日志记录组件。
2、log4net记录日志的功能非常强大。
它可以将日志分**不同的等级**,以**不同的格式**,输出到**不同的媒介**。


二、Log4net日志等级

1、不同的级别是作为常量定义在log4net.spi.Level类中。

2、日志的等级,它们由高到底分别为:
OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 

高于等级设定值方法(如何设置参见“配置文件详解”)都能写入日志, Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽略而不写入文件,但是FATAL, ERROR,WARN,INFO会被写入,因为他们等级高于INFO。

3、在具体写日志时,一般可以这样理解日志等级:
1)FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。
2)ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。
3)WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。
4)INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。
5)DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。


三、 Log4net的结构

1、log4net 有六种主要的组件

Logger,Repository,Appenders, Filters, Layouts 和Object Renders。


2、Logger

Logger是应用程序需要交互的主要组件,它用来产生日志消息。

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目录下的几个例子。

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对象设置的不同日志优先级别上。框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。

这里写图片描述

在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");
}

3、Repository

Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository,需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。

如果你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你需要用到LogManager类来自动管理库和日志对象。


4、Appender

主要负责记录日志介质的方式。log4net使用一个叫做Appender的组件来定义输出介质。这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。Log4net框架提供了几个Appender组件。也可以从log4net.Appender.AppenderSkeleton类继承,自定义Appender组件。

输出方式主要包括:
1)AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式。
2)AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
3)BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
4)ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
5)ConsoleAppender:将日志输出到控制台。
6)EventLogAppender:将日志写到Windows操作系统的日志中去。
7)FileAppender:将日志写到文件中。
8)ForwardingAppender:用来为一个Appender指定一组约束。
9)MemoryAppender:将日志存到内存缓冲区。
10)NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端
11)OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
12)RemotingAppender:通过.NET Remoting将日志写到远程接收端。
13)RollingFileAppender:将日志以回滚文件的形式写到文件中。
14)SmtpAppender:将日志写到邮件中。
15)SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
16)TraceAppender:将日志写到.NET trace 系统。
17)UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。


5、Appender Filters

一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。

使用过滤器可以过滤掉Appender输出的内容。过滤器通常有以下几种:
DenyAllFilter 阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter 与Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录


6、Layouts

Layout用于控制Appender的输出格式,可以是线性的也可以是XML。
一个Appender只能有一个Layout。要实现你自己的Layout类,你需要从log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。

最常用的Layout:
1)SimpleLayout简单输出格式,只输出日志级别与消息内容。
2)RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。样式如“yyyy-MM-dd HH:mm:ss“
3)ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。
4)PatterLayout使用最多的一个Layout,能输出的信息很多,使用方式可参见上面例子中的配置文件。


7、Object Renders

它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)

例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它(我们在本文中的扩展不使用这种方法,而是直接实现一个自定义的Layout)。这时logger就会知道如何把Orange记录到日志中了。

点击复制链接 与好友分享!回本站首页
相关TAG标签 简介
上一篇:Log4net的(appender)配置实例
下一篇:opencv-漫水填充
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 第一门户--致力于做实用的IT技术学习网站