LOG4NET图文教程

时间:2024-04-15 16:27:26

LOG4NET教程

一:简介

        从操作系统到大多数的大型软件,都会有自己的程序运行时的日志跟踪API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而软件开发人员需要一套强大的日志系统来记录系统运行时的信息。日志记录往往是软件开发周期中的重要组成部分,它具有以下几个优点:
       1.它可以为开发人员提供应用程序运行时的精确环境,便于发现程序BUG;
       2.程序中加入了日志记录,程序运行过程中就无需人工干预;
       3.日志信息文件可以输出到不同地方,为后来近一步研究扩展该程序提供详细资料。
而要达到这样的功能,在小型的程序中,我们可以自己开发日志记录追踪系统,只是简单实现txt之类的文件操作,便可把调用该方法的地方的日志记录下来。
       Log4net 是基于.net开发的一款非常著名的记录日志开源组件。它最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个 非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。

 

二:下载

       我们可以到logging.apache.org/log4net/download_log4net.cgi网站上下载LOG4NET的源代码或者编译后的版本。可以在使用log4net的项目中添加log4net.dll引用便可使用,也可以将源代码添加到解决方案中以项目的形式存在,然后调用生成的dll文件。

 

三:Log4net组成

       Log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局)

      1.Logger(记录器)

            1.1Logger接口

                    Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

                    Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.ca.b,那么我们说a.ba.b.c的祖先,每一个logger都继承了祖先的属性

                   Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口

                   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

          1.2日志级别

                   在ILog接口中定义了五种不同的方法可以跟踪一个应用程序,事实上,这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期,因此,框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。优先级从高到低依次排列如下:FATAL > ERROR > WARN > INFO > DEBUG

       2.Repository(库)

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

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

      3.Appender(符着器)

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

Log4net目前支持的输出方式包括:

1 AdoNetAppender
   将日志记录到数据库中。可以采用SQL和存储过程两种方式。

2 AnsiColorTerminalAppender
   在ANSI 窗口终端写下高亮度的日志事件。

3 AspNetTraceAppender
   能用asp.net中Trace的方式查看记录的日志。

4 BufferingForwardingAppender
   在输出到子Appenders之前先缓存日志事件。

5 ConsoleAppender
   将日志输出到控制台。

6 EventLogAppender
   将日志写到Windows Event Log.

7 FileAppender
将日志写到文件中。

8 LocalSyslogAppender
   将日志写到local syslog service (仅用于UNIX环境下). 
9 MemoryAppender
   将日志存到内存缓冲区。

10 NetSendAppender
   将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

11 RemoteSyslogAppender
   通过UDP网络协议将日志写到Remote syslog service。

12 RemotingAppender
   通过.NET Remoting将日志写到远程接收端。

13 RollingFileAppender
   将日志以回滚文件的形式写到文件中。

14 SmtpAppender
   将日志写到邮件中。

15 TraceAppender
   将日志写到.NET trace 系统。

16 UdpAppender
   将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。 

    4.Layout(布局)

              Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示,主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象,只能对应一个Layout对象。要实现你自己的Layout类,你需要从log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。

log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。           

%m[%message]  : 输出的日志消息  

%n                    : 换行  

%d[%datetime]   :输出当前语句运行的时刻  

%r                    : 输出程序从运行到执行到当前语句时消耗的毫秒数  

%d                     : 当前语句所在的线程ID  

%p                    : 日志的当前优先级别  

%c                    :当前日志对象的名称  

%L                    : 输出语句所在的行号  

%F                    :输出语句所在的文件名        

%-数字:表示该项的最小长度,如果不够,则用空格填充