Log4Net(Logging for DotNet)学习笔记

系统支持(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 makingCareer-Minded-Executive-Entourage  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.0,vs2005正版)

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



  还有两个特殊的级别: ALL和OFF。ALL表示允许所有的日志请求。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">

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

                   <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,2个textbox:

  

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,使用者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能。同时,通过外部配置文件,用户可以不用重新编译程序就能改变应用的日志行为,使得用户可以根据情况灵活地选择要记录的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值