有关.NET环境下log4net

 

 



1
实现目的
 
一个好的应用系统离不开log文件的支持,所以log文件的处理在应用系统的开发过程中是占很大比重的。log文件的处理方法有很多种,采用一种功能强大且方法简单的处理方法,不但能保证log文件的输出质量,更能大大缩短系统开发和维护的周期。本文介绍的.net环境下log文件处理解决方案,采用的是开源日志框架log4net。本文介绍的log4net基于log4net-1.2.0版本。 

 


2 log4net概述
 

log4net是一个辅助应用系统输出多种样式log信息的日志框架,它是著名的log4j框架在.net环境下的实现,在实际应用中,可以采用和log4j类似的方法在.net环境下构建起一个功能强大的log处理系统。log4net和应用系统的结合不需要修改应用系统本身的代码,它们之间的绑定非常简单,并且log4net处理log信息是和应用系统同步的,其处理速度和输出的多样性也是其它任何log处理系统无法比拟的。log4net最有特色的地方是,它对log进行了分等级处理,这样应用系统可以在实际运行环境下很简单的输出不同级别的log信息,帮助系统开发维护人员在最快的时间里得到最有用的系统log信息。 

log4net处理log文件的方法是灵活多变的,它可以将log信息输出不同的样式和输出到不同的地方,如控制台(Console),文本文件,XML文件,以流的形式发送到其它地方(如数据库),发送到电子邮件中,根据天数或者文件大小产生新的文件等等。并且开发人员可以根据自己的喜好格式化log输出,如自由指定样式,可以包含log级别与log信息,包含log时间、线程、类别等信息的样式等等。 

本文以最常见的log输出形式:输出到文本文件和数据库作为范例来介绍log4net的使用方法 

  


3 log4net 主要结构分析


    在使用log4net之前先了解log4net的结构是非常有必要的,下面简要分析log4net结构中重要的几个部分。 

3.1 Logger 
    Logger
是应用程序与log4net交互的主要模块,它也是log4net生成log的模块。Logger主要负责得到log信息,得到log信息之后接下来的显示log则是在Layout模块中处理。 

3.1.1 Logger的管理方式

Logger提供了多种方法用于记录任何类型的log信息,可以在应用程序中使用多个Logger实例,而把它们的维护工作交给log4net框架作为“命名实体(Named Entity)”进行维护。这就意味着,不再需要将应用程序中生成的Logger实例作为参数在应用程序中传递,以便应用程序中的其它模块能使用该实例。唯一需要做的就是通过Logger的命名来调用它。

    目前,log4net使用类似.net命名空间的方式管理命名实体。例如,有两个Logger,分别定义为logger.First以及logger.First.One。那么这两个是不同的Logger,而且logger.First是logger.First.One的祖先,同时logger.First.One继承了logger.First的属性。位于命名空间最高层的Logger是默认Logger,也被称为根Logger(Root Logger)。 

3.1.2 实现自己的Logger 

如果要实现自己的Logger,那么log4net提供了接口ILog用于实现自己的LoggerILog的大致结构如下: 

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); 

bool  isDebugEnabled;

bool  isInfoEnabled; 




在Logger中,log4net提供了一个名为LogManager的类给我们用于获取或者创建一个Logger。LogManager提供了方法GetLogger(),该方法接收一个string类型的参数,用于指定Logger的名称:
log4net.ILog log  =  log4net.LogManager.GetLogger(”Logger_Name”) ;

当指定名称的Logger不存在时,LogManager将自动创建一个。通常情况下,都是使用Logger所在类的名称来作为Logger的名称,即GetLogger方法的参数可以是typeof(ClassName)。也可以使用如下的方法来传递该参数: 
log4net.Ilog log  =  log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

尽管上面的代码比typeof(ClassName)要长的多,但是这样做可以在任何一个类中使用相同的方法传递参数,从而减少出错的机率。 

3.2 Logger Level:log级别  

从上面的ILog的接口可以看出,log4net有5种不同的记录方式。为什么需要有这5种记录方式呢?其实,这5种记录方式存在不同的优先级别。这些级别定义在log4net.spi.level中。可以根据需要在应用中使用任意一个方法,但是,为了在使用了这些方法之后,在回收时不至于浪费太多的CPU周期。因此,log4net提供了7个等级以及它们各自的布尔属性来节省CPU周期,如下: 

Logger的不同等级: 

Level 

Allow Method

Boolean Property

Value

OFF

Highest

FATAL

void Fatal(...);

bool IsFatalEnabled;

ERROR

void Error(...); 

bool IsErrorEnabled;

WARN    

void Warn(...);

bool IsWarnEnabled;

INFO

void Info(...);

bool IsInfoEnabled;

DEBUG

void Debug(...);

bool IsDebugEnabled;

ALL

Lowest

在log4net中,每一个Logger会通过配置文件中的配置信息给予一个优先级别,如果没有指定的优先级别,那么它将尝试从它的父类中继承一个优先级别。同样,Logger的每一个方法都有一个预定义的级别,如上表中列出的,Info()方法有着INFO的级别。当运行时,log4net会检查方法的级别以及配置文件赋予Logger的级别,然后执行不同的操作。例如,假设某个Logger具有INFO的级别,那么当执行如下操作时: 

Logger.Info(“message”);

Logger.Debug(“message”);

Logger.Warn(“message”);

将会有如下的情况:

1 方法Info的级别等于Logger的INFO级别,那么Info方法将执行; 

2 方法Debug的级别低于Logger的INFO级别,那么Debug方法将不执行或抛出异常; 

3、方法Warn的级别高于Logger的INFO级别,那么Warn方法将被执行。 

由此可以看出,当方法的级别大于或等于Logger的级别时,方法将得以执行。 

在上表中还定义了两个特殊的级别:ALL和OFF。ALL意味着任何方法都可以执行,OFF则相反。为了明确那些操作能够执行,可以用上表中的属性进行判断: 

if  (logger.IsDebugEnabled){

 Logger.Debug(
" message " );

}


3.3
 Appender:log目的地  

每个Logger都可以拥有一个或者多个appender,每个appender表示一个log的输出目的地,比如console、某个文件、数据库甚至电子邮件。可以使用Logger.addAppender(Appender app)为logger增加一个appender;也可以使用Logger.removeAppender(Appender app)为logger移除一个appender。 

默认情况下,Logger的additive标志被设置为true,表示子Logger将继承父Logger的所有appenders。该选项可以被重置,表示子Logger将不再继承父Logger的appenders。 

Root Logger拥有目标为System.console的consoleAppender,故默认情况下,所有的Logger都将继承该appender。 

3.4 Layout:log格式化器  

每个appender都和一个layout相联系;layout的任务是格式化用户的logging request。Layout使log的输出样式多样,比如可以在输出的log信息中包含log级别、log时间、线程、异常信息等。 

appender的任务是把layout格式化好的输出内容送往指定的目的地。 

3.5 Configuration:配置信息  

对log4net环境的配置就是对Root Logger的配置,包括把Root Logger设置为哪个级别(level);为它增加哪些appender,等等。这些可以通过设置系统属性的方法来隐式地完成,也可以在程序里调用XXXConfigurator.configure()方法来显式地完成。以上介绍的几部分是log4net中最主要的几部分,在使用log4net之前了解这几部分的主要结构和作用非常有助于更好的使用log4net。下面介绍log4net在.net应用程序中的使用方法。

4 Log4net的使用方法  

在.net应用程序中使用log4net非常简单,完全不需要改变.net应用程序的结构,只需要为项目添加log4net引用,配置config文件,实例化一个Logger实例,在需要输出log的地方调用Logger的方法即可。使用log4net最重要的地方是config文件的配置。 

4.1 config文件配置 

在Application项目中,log4net默认读取配置信息的文件是App.config,在Web项目中默认读取配置信息的文件是Web.config。但是config文件的配置方法在这两种情况下都是相同的,所以可以很简单的将一个config文件从Application项目移植到Web项目中。前面介绍过的将log输出到文本文件、数据库、XML文件等多种输出形式,以及log输出的多种样式等,在应用程序中只需要配置config文件即可实现,完全不用改动程序。下面介绍将log输出到文本文件和数据库的config文件配置方法。 

4.1.1 输出log到文本文件的config文件配置  

输出log到文本文件,需要在config文件中指定log文件的存放路径,文件名称,log输出格式,文本文件达到多大时重新创建文件等等,如下:
 1 < configuration >
 2
 3 < configSections >
 4
 5    < section  name ="log4net"  type ="System.Configuration.IgnoreSectionHandler"
 6
 7 />
 8
 9   </ configSections >
10
11   < log4net >
12
13 < appender  name ="LogFileAppender"  type ="log4net.Appender.FileAppender" >
14
15   < param  name ="File"  value ="c:" LogData"log.txt"  />
16
17   < param  name ="AppendToFile"  value ="true"   />
18
19    < layout  type ="log4net.Layout.PatternLayout" >
20
21   < param  name ="Header"  value ="[Header]" r"n"  />
22
23   < param  name ="Footer"  value ="[Footer]" r"n"  />
24
25   < param  name ="ConversionPattern"  value ="%d [%t] %-5p %c [%x] 
26
27 &lt;%X{auth}&gt; - %m%n"   />
28
29   </ layout >
30
31   </ appender >
32
33   < root >
34
35   < level  value ="DEBUG"   />
36
37   < appender-ref  ref ="LogFileAppender"   />
38
39    </ root >   
40
41 < logger  name ="OpenDB" >
42
43      < level  value ="INFO"   />
44
45 </ logger >
46
47 </ log4net >
48
49 </ configuration >   
50
51 下面分析config文件配置信息中主要部分代表的意义:
52
53 < configSections >
54
55 < section  name ="log4net"  type ="System.Configuration.IgnoreSectionHandler" />
56
57 </ configSections >
58
59 这一部分定义了使用System.Configuration.IgnoreSectionHandler接口类读取config文
60
61 件中的配置信息,一般来说,这一部分在所有的应用中是相同的。
62
63 < appender > </ appender > 中间的部分分析:
64
65 这一部分首先定义了type="log4net.Appender.FileAppender"是指要输出的log将写入到文件(File)中,如果是写入到数据库中,这里将这样配置:
66
67 < appender  name ="ADOAppender"  type ="log4net.Appender.ADONetAppender"
68
69 下面的部分指定了输出文件的路径及文件名:
70
71 <param name ="File"  value ="c:" LogData"log.txt"  />
72
73   < param  name ="AppendToFile"  value ="true"   />
74
75 < layout > 和  </ layout > 中间的部分指定log输出的样式:
76
77 < PRE  style ="BACKGROUND: #dddddd; MARGIN: 12pt 0cm; LAYOUT-GRID-M
78


 



log4net是一个优秀的开源日志项目,现将本人使用写成一个demo,如下

0:准备
http://logging.apache.org/,可下载log4net,最新为1.2版本,
建立一个asp.net web 项目,并将log4net.dll添加到引用

1:建立数据表

CREATE   TABLE   [ dbo ] . [ Log ]  ( 
[ Id ]   [ int ]   IDENTITY  ( 1 1 NOT   NULL
[ Date ]   [ datetime ]   NOT   NULL
[ Thread ]   [ varchar ]  ( 255 NOT   NULL
[ Level ]   [ varchar ]  ( 50 NOT   NULL
[ Logger ]   [ varchar ]  ( 255 NOT   NULL
[ Message ]   [ varchar ]  ( 4000 NOT   NULL
[ Exception ]   [ varchar ]  ( 2000 NULL  

2:编写配置文件

 1 < configuration >  
 2 < configSections >  
 3 < section  name ="log4net"  type ="log4net.Config.Log4NetConfigurationSectionHandler, log4net"   />  
 4 </ configSections >  
 5
 6 < system.web >  
 7 <!--  
 8  
 9 -->  
10 </ system.web >  
11
12 < log4net >  
13
14 < root >  
15 < level  value ="ALL"   />  
16 < appender-ref  ref ="ADONetAppender"   />  
17 </ root >  
18
19 <!--  
20 <logger name="testApp.Logging"> 
21 <level value="ALL"/> 
22 <appender-ref ref="ADONetAppender" /> 
23
24 </logger> 
25 -->  
26
27 < appender  name ="ADONetAppender"  type ="log4net.Appender.ADONetAppender" >  
28 < bufferSize  value ="10"   />  
29 < connectionType  value ="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"   />  
30 < connectionString  value ="server=localhost;database=demo;user id=sa;password=123456"   />  
31 < commandText  value ="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"   />  
32 < parameter >  
33 < parameterName  value ="@log_date"   />  
34 < dbType  value ="DateTime"   />  
35 < layout  type ="log4net.Layout.RawTimeStampLayout"   />  
36 </ parameter >  
37 < parameter >  
38 < parameterName  value ="@thread"   />  
39 < dbType  value ="String"   />  
40 < size  value ="255"   />  
41 < layout  type ="log4net.Layout.PatternLayout" >  
42 < conversionPattern  value ="%thread"   />  
43 </ layout >  
44 </ parameter >  
45 < parameter >  
46 < parameterName  value ="@log_level"   />  
47 < dbType  value ="String"   />  
48 < size  value ="50"   />  
49 < layout  type ="log4net.Layout.PatternLayout" >  
50 < conversionPattern  value ="%level"   />  
51 </ layout >  
52 </ parameter >  
53 < parameter >  
54 < parameterName  value ="@logger"   />  
55 < dbType  value ="String"   />  
56 < size  value ="255"   />  
57 < layout  type ="log4net.Layout.PatternLayout" >  
58 < conversionPattern  value ="%logger"   />  
59 </ layout >  
60 </ parameter >  
61 < parameter >  
62 < parameterName  value ="@message"   />  
63 < dbType  value ="String"   />  
64 < size  value ="4000"   />  
65 < layout  type ="log4net.Layout.PatternLayout" >  
66 < conversionPattern  value ="%message"   />  
67 </ layout >  
68 </ parameter >  
69 < parameter >  
70 < parameterName  value ="@exception"   />  
71 < dbType  value ="String"   />  
72 < size  value ="2000"   />  
73 < layout  type ="log4net.Layout.ExceptionLayout"   />  
74 </ parameter >  
75 </ appender >  
76
77 </ log4net >  
78
79 </ configuration >  
80
81

特别说明<bufferSize value="10" />,这是log信息记录的缓冲大小,(比如只有log信息记录达到10,
才会将log信息记录写入数据库)

3:在Global.asax.cs中

protected   void  Application_Start(Object sender, EventArgs e) 

// 读取配置信息 
log4net.Config.DOMConfigurator.Configure(); 


4:一个使用log的demo类

using  System; 

namespace  Log 

///   <summary>  
///  MyLog 的摘要说明。 
///   </summary>  
public   class  MyLog 

private   static   readonly  log4net.ILog log  =  log4net.LogManager.GetLogger( typeof (MyLog)); 
public   static   void  LogInfo() 

log.Info(
" log日志 " ); 


public   static   void  LogError() 

log.Info(
" log错误 " ); 





5:资源:
my blog:http://tomch.donews.net/tomch/posts/22457.aspx
主站 logging.apache.org/
学习使用log4net的文章 www.ondotnet.com/pub/a/dotnet/2003/06/16/log4net.html

转载于:https://www.cnblogs.com/greatandforever/archive/2008/07/17/1245089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值