态度决定高度、企图决定版图、格局决定结局

导航

Log4Net学习笔记

Log4Net(Logging for DotNet)学习笔记

 

今天(2006-6-10)下午,从冬冬的blog上看看它,其文如下:

系统支持(SystemFramework):提供系统的框架支持,典型的,如异常、日志等。也有现成的,比如log4net      

突然一种老朋友似的感觉涌上心头,这不是我一直想要得到的吗?一直想在的我系统加入的东西吗―――-日志系统。嘿嘿,高兴啊!本文从一个使用者,非系统研究者的角度写下此文。

1.   Log4Net谁把你先做了?你是我一直想搞定的啊!

Logging Services Project @ Apache

log4net is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Logging Services project. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF. As log4net is undergoing incubation these releases are not officially endorsed by the ASF.

从这里(http://logging.apache.org/log4net/downloads.html)你可以得到最权威的答案。它是Apache基金的一个项目。开源,免费,嘿嘿,自然的哦!

对了,它还有很多兄弟姐妹,从这里你可以了解到它们(http://logging.apache.org/)。

马上down一下。

2.    迫不及待的看看效果:

a)         Create a web project(DotNetFramework2.0vs2005正版)

b)        添加一个引用,log4net-1.2.10\log4net-1.2.10\bin\net\2.0\debug\log4net.dll,我们可以看见出现三个文件,其中有一个是xml的配置文档(log4net.xml),

继续学习:

1.  Log4net的结构

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

2.  Log4net可以将我们的日志指定到多target。比如File,DataBase,Console,ect

3.  Log4net logging分级别

级别

允许的方法

Boolean属性

优先级别

Highest

void Fatal(...);

 bool IsFatalEnabled;

FATAL

 

void Error(...);

 bool IsErrorEnabled;

RROR

 

 void Warn(...);
 

bool IsWarnEnabled;

WARN

 

void Info(...);

 bool IsInfoEnabled;

INFO

Lowest

void Debug(...);

 bool IsDebugEnabled;

DEBUG

  还有两个特殊的级别: ALLOFFALL表示允许所有的日志请求。OFF是拒绝所有的请求

4.  好了,下面配置web.config,使它指定我们的日志存储方式。这是通过配置appender(附着器)来实现的。如何入手呢?

a)         你可以从我们上文提到的那个xml(log4net.xml)文档中找到example.相当多的例子。

b)        或者按照下面给出的操作进行:

                             上面的图片,就是我们的web.config的骨架.很显然,你应该已经明白,其中的

<log4net debug=”false” >是我们需要配置的重点。当然,别忘记了<section>的那点配置。

 

下面给出我的例子,文件存储。

<log4net debug=”false”>

<appender name="LogFileAppender" type="log4net.Appender.FileAppender">

                             <param name="File" value="SunSystem.log.txt"/>

                            <param name="datePattern" value="MM-dd HH:mm"/>

                            <param name="AppendToFile" value="true"/>

                             <layout type="log4net.Layout.PatternLayout">

                                     <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>

                             </layout>

</appender>

                      <root>

                             <level value="DEBUG"/>

                            <appender-ref ref=" LogFileAppender "/>

                      </root>

</log4net>

 

下面这个是数据库(sqlsever)配置的例子:

create a table:

 

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

)

 

<log4net debug="false">

          //千万不要让这个nametpye相同,否则,将无法有日志输出。原因不明(也许是关键字吧)

                   <appender name="AdoNetAppender_SQL" type="log4net.Appender.AdoNetAppender">

                            <bufferSize value="100" />

                            <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

                            <connectionString value="data source= 【服务器】;initial catalog= 数据库名】;integrated security=false;persist security info=True;User ID=sa;Password=sa" />

                            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

                            <parameter>

                                     <parameterName value="@log_date" />

                                     <dbType value="DateTime" />

                                     <layout type="log4net.Layout.RawTimeStampLayout" />

                            </parameter>

                            <parameter>

                                     <parameterName value="@thread" />

                                     <dbType value="String" />

                                     <size value="255" />

                                     <layout type="log4net.Layout.PatternLayout">

                                               <conversionPattern value="%thread" />

                                     </layout>

                            </parameter>

                            <parameter>

                                     <parameterName value="@log_level" />

                                     <dbType value="String" />

                                     <size value="50" />

                                     <layout type="log4net.Layout.PatternLayout">

                                               <conversionPattern value="%level" />

                                     </layout>

                            </parameter>

                            <parameter>

                                     <parameterName value="@logger" />

                                     <dbType value="String" />

                                     <size value="255" />

                                     <layout type="log4net.Layout.PatternLayout">

                                               <conversionPattern value="%logger" />

                                     </layout>

                            </parameter>

                            <parameter>

                                     <parameterName value="@message" />

                                     <dbType value="String" />

                                     <size value="4000" />

                                     <layout type="log4net.Layout.PatternLayout">

                                               <conversionPattern value="%message" />

                                     </layout>

                            </parameter>

                            <parameter>

                                     <parameterName value="@exception" />

                                     <dbType value="String" />

                                     <size value="2000" />

                                     <layout type="log4net.Layout.ExceptionLayout" />

                            </parameter>

                   </appender>

          <root>

                   <level value="DEBUG"/>

                            <appender-ref ref="AdoNetAppender_SQL"/>

                   </root>

</log4net>

 

 

可以了,现在让我们的web系统启动时,关联配置文件:

    void Application_Start(object sender, EventArgs e)

    {

        log4net.Config.DOMConfigurator.Configure();

 

}//Global.asax

 

以上配置可以了。

写代码了,哪里你需要用这个框架为你的异常或日志做记录。

我做了一个简单的例子:

webform上放一个button,2textbox

  

 protected void Button1_Click(object sender, EventArgs e)

    {

        log4net.ILog logger = log4net.LogManager.GetLogger(this.GetType());

        int a = 0;

        int b = 0;

        int c = 0;

        try

        {

             a = Convert.ToInt32(this.TextBox1.Text.Trim());

             b = Convert.ToInt32(this.TextBox2.Text.Trim());

             c = a / b;

        }

        catch (Exception err)

        {

            logger.Debug(err.ToString());

        }

        finally{

            Response.Write(c.ToString());

           

        }

}

  选择文件输出方式:

   输入:5/0,产生异常,输出到文件。效果明显啊!

   在我们的SunSystem.log.txt 文件中:

   

2006-06-10 16:01:01,004 [10] INFO  ASP.default_aspx [(null)] - System.DivideByZeroException: 试图除以零。

   _Default.Button1_Click(Object sender, EventArgs e) 位置 e:\MyProjects\webapp\Log4Test\Default.aspx.cs:行号 27

 

再测试:abc/cde ,产生异常:

 

2006-06-10 16:00:55,020 [10] INFO  ASP.default_aspx [(null)] - System.FormatException: 输入字符串的格式不正确。

   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)

   System.Convert.ToInt32(String value)

   _Default.Button1_Click(Object sender, EventArgs e) 位置 e:\MyProjects\webapp\Log4Test\Default.aspx.cs:行号 25

 

选择数据库为输出对象:

 

同样的测试:

 

一个最基础的运用就完成了!

 

 

疑问????

1.是否可以同时输出到文件和数据库?

2.那个root结点干什么的啊?

 

====è

1.      可以同时保存到多种介质。

<root>

            <level value="DEBUG"/>

<appender-ref ref="LogFileAppender"/>

 

<appender-ref ref="AdoNetAppender_SQL"/>

<appender-ref ref="ColoredConsoleAppender"/>

</root>

2.     Root 节点的意思?

<root>

  <level value="WARN" />

  <appender-ref ref="LogFileAppender" />

  <appender-ref ref="ConsoleAppender" />

</root>

 

在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定<logger>标签的additivity属性为false而改变。

<logger name="testApp.Logging" additivity="false">

</logger>

Additivity的值缺省是true.

 

3 进一步的学习中…………

 

使用log4net可以很方便地为应用添加日志功能。应用Log4net,使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。

 

 

 

 

posted on 2006-06-10 20:45  flyingchen  阅读(2227)  评论(2编辑  收藏  举报