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输出格式,文本文件达到多大时重新创建文件等等,如下:
<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<%X{auth}> - %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
78log4net是一个优秀的开源日志项目,现将本人使用写成一个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