﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-网摘-文章分类-log4net</title><link>http://www.blogjava.net/jvict/category/34417.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 05 Sep 2008 05:44:37 GMT</lastBuildDate><pubDate>Fri, 05 Sep 2008 05:44:37 GMT</pubDate><ttl>60</ttl><item><title>Log4Net使用指南 </title><link>http://www.blogjava.net/jvict/articles/227173.html</link><dc:creator>Documents</dc:creator><author>Documents</author><pubDate>Fri, 05 Sep 2008 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/jvict/articles/227173.html</guid><wfw:comment>http://www.blogjava.net/jvict/comments/227173.html</wfw:comment><comments>http://www.blogjava.net/jvict/articles/227173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jvict/comments/commentRss/227173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jvict/services/trackbacks/227173.html</trackback:ping><description><![CDATA[<div style="font-size: 10pt"><a href="http://www.cnblogs.com/wangchunlan2004/articles/473400.html">http://www.cnblogs.com/wangchunlan2004/articles/473400.html</a><br />
请在这里下载<a href="http://files.cnblogs.com/dragon/Log4NetTester.rar">示例代码</a>&nbsp; <br />
<p style="font-size: 10pt">1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简介<O:P></O:P> </p>
<p style="font-size: 10pt">1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4net的优点：<O:P></O:P> </p>
<p style="font-size: 10pt">几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后，就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 </p>
<p style="font-size: 10pt">经验表明，日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点：它可以提供应用程序运行时的精确环境，可供开发人员尽快找到应用程序中的Bug；一旦在程序中加入了Log 输出代码，程序运行过程中就能生成并输出日志信息而无需人工干预。另外，日志信息可以输出到不同的地方（控制台，文件等）以备以后研究之用。 </p>
<p style="font-size: 10pt">Log4net就是为这样一个目的设计的，用于.NET开发环境的日志记录包。 </p>
<p style="font-size: 10pt">1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4net的安装：<O:P></O:P> </p>
<p style="font-size: 10pt">用户可以从<a href="http://logging.apache.org/log4net/">http://logging.apache.org/log4net/</a>下载log4net的源代码。解压软件包后，在解压的src目录下将log4net.sln载入Visual Studio .NET，编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能，只需将log4net.dll引入工程即可。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4net的结构<O:P></O:P> </p>
<p style="font-size: 10pt">log4net 有四种主要的组件，分别是Logger（记录器）, Repository（库）, Appender（附着器）以及 Layout（布局）. </p>
<p style="font-size: 10pt">2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger<a name="Logger"></a><O:P></O:P> </p>
<p style="font-size: 10pt">2.1.1&nbsp;&nbsp;&nbsp;&nbsp; Logger接口<O:P></O:P> </p>
<p style="font-size: 10pt">Logger是应用程序需要交互的主要组件，它用来产生日志消息。产生的日志消息并不直接显示，还要预先经过Layout的格式化处理后才会输出。 </p>
<p style="font-size: 10pt">Logger提供了多种方式来记录一个日志消息，你可以在你的应用程序里创建多个Logger，每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象，你不必将它在不同的类或对象间传递，只需要用它的名字为参数调用就可以了。log4net框架使用继承体系，继承体系类似于.NET中的名字空间。也就是说，如果有两个logger,分别被定义为a.b.c和a.b，那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性 </p>
<p style="font-size: 10pt">Log4net框架定义了一个ILog接口，所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger，你必须首先实现这个接口。你可以参考在/extension目录下的几个例子。 </p>
<p style="font-size: 10pt">ILog接口的定义如下： </p>
<p style="font-size: 10pt">public interface ILog </p>
<p style="font-size: 10pt">{ </p>
<p style="font-size: 10pt">&nbsp; void Debug(object message); </p>
<p style="font-size: 10pt">&nbsp; void Info(object message); </p>
<p style="font-size: 10pt">&nbsp; void Warn(object message); </p>
<p style="font-size: 10pt">&nbsp; void Error(object message); </p>
<p style="font-size: 10pt">&nbsp; void Fatal(object message); </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">//以上的每一个方法都有一个重载的方法，用来支持异常处理。 </p>
<p style="font-size: 10pt">//每一个重载方法都如下所示，有一个异常类型的附加参数。 </p>
<p style="font-size: 10pt">&nbsp; void Debug(object message, Exception ex); </p>
<p style="font-size: 10pt">&nbsp; // ... </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">//Boolean 属性用来检查Logger的日志级别 </p>
<p style="font-size: 10pt">//（我们马上会在后面看到日志级别） </p>
<p style="font-size: 10pt">&nbsp; bool isDebugEnabled; </p>
<p style="font-size: 10pt">&nbsp; bool isInfoEnabled; </p>
<p style="font-size: 10pt">&nbsp; //&#8230; 其他方法对应的Boolean属性 </p>
<p style="font-size: 10pt">} </p>
<p style="font-size: 10pt">Log4net框架定义了一个叫做LogManager的类，用来管理所有的logger对象。它有一个GetLogger()静态方法，用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象，它也会为我们创建一个Logger对象。代码如下所示： </p>
<p style="font-size: 10pt">log4net.ILog log = log4net.LogManager.GetLogger("logger-name"); </p>
<p style="font-size: 10pt">通常来说，我们会以类（class）的类型（type）为参数来调用GetLogger()，以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得，或者可以用如下的反射方法来获得： </p>
<p style="font-size: 10pt">System.Reflection.MethodBase.GetCurrentMethod().DeclaringType </p>
<p style="font-size: 10pt">尽管符号长了一些，但是后者可以用于一些场合，比如获取调用方法的类(class)的类型(type)。 </p>
<p style="font-size: 10pt">2.1.2&nbsp;&nbsp;&nbsp;&nbsp; 日志的级别<O:P></O:P> </p>
<p style="font-size: 10pt">正如你在ILog的接口中看到的一样，有五种不同的方法可以跟踪一个应用程序。事实上，这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期，因此，框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">Level有以下几种取值 </p>
<table cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">级别<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">允许的方法<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">Boolean属性<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt">优先级别<O:P></O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">OFF<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">&nbsp;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">&nbsp;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt">Highest<O:P></O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">FATAL<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">void Fatal(...);<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">bool IsFatalEnabled;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">RROR<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">void Error(...);<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">bool IsErrorEnabled;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">WARN<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">void Warn(...);<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">bool IsWarnEnabled;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">INFO<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">void Info(...);<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">bool IsInfoEnabled;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">DEBUG<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt">void Debug(...);<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">bool IsDebugEnabled;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" width="69">
            <p style="font-size: 10pt">ALL<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="118">
            <p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
            </td>
            <td style="font-size: 10pt" width="154">
            <p style="font-size: 10pt">&nbsp;<O:P></O:P> </p>
            </td>
            <td style="font-size: 10pt" width="81">
            <p style="font-size: 10pt">Lowest<O:P></O:P> </p>
            </td>
        </tr>
    </tbody>
</table>
<p style="font-size: 10pt" align="center">表1&nbsp; Logger的日志级别 </p>
<p style="font-size: 10pt">在log4net框架里，通过设置配置文件，每个日志对象都被分配了一个日志优先级别。如果没有给一个日志对象显式地分配一个级别，那么该对象会试图从他的祖先继承一个级别值。 </p>
<p style="font-size: 10pt">ILog接口的每个方法都有一个预先定义好了的级别值。正如你在表1看到的，ILog的Inof()方法具有INFO级别。同样的，以此类推，Error()方法具有ERROR级别。当我们使用以上的任何一种方法时，log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时，日志请求才会被接受并执行。 </p>
<p style="font-size: 10pt">举例说明，当你创建了一个日志对象，并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时，框架会检查相应的Boolean属性，以决定该方法能不能执行。如下的代码： </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">Logger.Info("message"); </p>
<p style="font-size: 10pt">Logger.Debug("message"); </p>
<p style="font-size: 10pt">Logger.Warn("message"); </p>
<p style="font-size: 10pt">对于第一种方法，Info()的级别等与日志的级别（INFO），因此日志请求会被传递，我们可以得到输出结果&#8221;message&#8221;。 </p>
<p style="font-size: 10pt">对于第二种方法，Debug()的级别低于日志对象logger的日志级别(INFO)，因此，日志请求被拒绝了，我们得不到任何输出。同样的，针对第三行语句，我们可以很容易得出结论。 </p>
<p style="font-size: 10pt">在表1中有两个特殊的级别：ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。 </p>
<p style="font-size: 10pt">你也可以显式地检查Logger对象的Boolean属性，如下所示： </p>
<p style="font-size: 10pt">if (logger.IsDebugEnabled) </p>
<p style="font-size: 10pt">{ </p>
<p style="font-size: 10pt">&nbsp; Logger.Debug("message"); </p>
<p style="font-size: 10pt">} </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repository<O:P></O:P> </p>
<p style="font-size: 10pt">Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中，框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现，并且定义在log4net.Repository.Hierarchy 名字空间中。要实现一个Repository，需要实现log4net.Repository.ILoggerRepository 接口。但是通常并不是直接实现该接口，而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库 (hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。 </p>
<p style="font-size: 10pt">如果你是个log4net框架的使用者，而非扩展者，那么你几乎不会在你的代码里用到Repository的类。相反的，你需要用到LogManager类来自动管理库和日志对象。 </p>
<p style="font-size: 10pt">2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appender<a name="Appender"></a><O:P></O:P> </p>
<p style="font-size: 10pt">一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示，这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。 Log4net框架提供了几个Appender组件。关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件，一般来说你没有必要再自己编写了。但是如果你愿意，可以从log4net.Appender.AppenderSkeleton类继承。 </p>
<p style="font-size: 10pt">2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appender Filters<a name="Filters"></a><O:P></O:P> </p>
<p style="font-size: 10pt">一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender Filters) 可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器，你可以按照日志级别范围过滤日志事件，或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。 </p>
<p style="font-size: 10pt">2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Layout<a name="Layout"></a><O:P></O:P> </p>
<p style="font-size: 10pt">Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示，主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象，只能对应一个Layout对象。要实现你自己的Layout类，你需要从log4net.Layout.LayoutSkeleton类继承，它实现了ILayout接口。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序中使用log4net<O:P></O:P> </p>
<p style="font-size: 10pt">在开始对你的程序进行日志记录前，需要先启动log4net引擎。这意味着你需要先配置前面提到的三种组件。你可以用两种方法来设定配置：在单独的文件中设定配置或在代码中定义配置。 </p>
<p style="font-size: 10pt">因为下面几种原因，推荐在一个单独的文件中定义配置： </p>
<p style="font-size: 10pt">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你不需要重新编译源代码就能改变配置； </p>
<p style="font-size: 10pt">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以在程序正运行的时候就改变配置。这一点在一些WEB程序和远程过程调用的程序中有时很重要； </p>
<p style="font-size: 10pt">考虑到第一种方法的重要性，我们先看看怎样在文件中设定配置信息。 </p>
<p style="font-size: 10pt">3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义配置文件<O:P></O:P> </p>
<p style="font-size: 10pt">配置信息可以放在如下几种形式文件的一种中。 </p>
<p style="font-size: 10pt">在程序的配置文件里，如AssemblyName.config 或web.config. </p>
<p style="font-size: 10pt">在你自己的文件里。文件名可以是任何你想要的名字，如AppName.exe.xyz等. </p>
<p style="font-size: 10pt">log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。框架在配置文件里要查找的唯一标识是&lt;log4net&gt;标签。一个完整的配置文件的例子如下： </p>
<p style="font-size: 10pt" align="left"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&lt;?xml version="1.0" encoding="utf-8" ?&gt; </p>
<p style="font-size: 10pt">&lt;configuration&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;configSections&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;section name="log4net" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="log4net.Config.Log4NetConfigurationSectionHandler, </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4net-net-1.0" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;/configSections&gt; </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&nbsp; &lt;log4net&gt; </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;root&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;level value="WARN" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="LogFileAppender" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="ConsoleAppender" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/root&gt;<O:P></O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;logger name="testApp.Logging"&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;level value="DEBUG"/&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/logger&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;appender name="LogFileAppender" <O:P></O:P></p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="log4net.Appender.FileAppender" &gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="File" value="log-file.txt" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="AppendToFile" value="true" /&gt; </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="Header" value="[Header]\r\n"/&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="Footer" value="[Footer]\r\n"/&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="%d [%t] %-5p %c [%x]&nbsp; - %m%n" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<O:P></O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter type="log4net.Filter.LevelRangeFilter"&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="LevelMin" value="DEBUG" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="LevelMax" value="WARN" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/appender&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;appender name="ConsoleAppender" <O:P></O:P></p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="log4net.Appender.ConsoleAppender" &gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="%d [%t] %-5p %c [%x] - %m%n" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp; &nbsp;&lt;/appender&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; </p>
<p style="font-size: 10pt">&nbsp; &lt;/log4net&gt; </p>
<p style="font-size: 10pt">&lt;/configuration&gt; </p>
<p style="font-size: 10pt">你可以直接将上面的文本拷贝到任何程序中使用，但是最好还是能够理解配置文件是怎样构成的。 只有当你需要在应用程序配置文件中使用log4net配置时，才需要在&lt;configSection&gt;标签中加入&lt;section&gt;配置节点入口。对于其他的单独文件，只有&lt;log4net&gt;标签内的文本才是必需的，这些标签的顺序并不是固定的。下面我们依次讲解各个标签内文本的含义： </p>
<p style="font-size: 10pt">3.1.1&nbsp;&nbsp;&nbsp;&nbsp; &lt;root&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&lt;root&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;level value="WARN" /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;appender-ref ref="LogFileAppender" /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;appender-ref ref="ConsoleAppender" /&gt; </p>
<p style="font-size: 10pt">&lt;/root&gt; </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">在框架的体系里，所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义，则框架使用根日志中定义的属性。在&lt;root&gt;标签里，可以定义level级别值和Appender的列表。如果没有定义LEVEL的值，则缺省为DEBUG。可以通过&lt;appender-ref&gt;标签定义日志对象使用的Appender对象。&lt;appender-ref&gt;声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说，子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定&lt;logger&gt;标签的additivity属性为false而改变。 </p>
<p style="font-size: 10pt">&lt;logger name="testApp.Logging" additivity="false"&gt; </p>
<p style="font-size: 10pt">&lt;/logger&gt; </p>
<p style="font-size: 10pt">Additivity的值缺省是true. </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.1.2&nbsp;&nbsp;&nbsp;&nbsp; &lt;Logger&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">&lt;logger name="testApp.Logging"&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;level value="DEBUG"/&gt; </p>
<p style="font-size: 10pt">&lt;/logger&gt; </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&lt;logger&gt; 元素预定义了一个具体日志对象的设置。然后通过调用LogManager.GetLogger(&#8220;testAPP.Logging&#8221;)函数，你可以检索具有该名字的日志。如果LogManager.GetLogger(&#8230;)打开的不是预定义的日志对象，则该日志对象会继承根日志对象的属性。知道了这一点，我们可以说，其实&lt;logger&gt;标签并不是必须的。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.1.3&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender&gt;<O:P></O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">&lt;appender name="LogFileAppender" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="log4net.Appender.FileAppender" &gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;param name="File" value="log-file.txt" /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;param name="AppendToFile" value="true" /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;param name="Header" value="[Header]\r\n" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;param name="Footer" value="[Footer]\r\n"/&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;param name="ConversionPattern" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="%d [%t] %-5p %c - %m%n" </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;/layout&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;filter type="log4net.Filter.LevelRangeFilter"&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;param name="LevelMin" value="DEBUG" /&gt; </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;param name="LevelMax" value="WARN" /&gt; </p>
<p style="font-size: 10pt">&nbsp; &lt;/filter&gt; </p>
<p style="font-size: 10pt">&lt;/appender&gt; </p>
<p style="font-size: 10pt"></p>
<p style="font-size: 10pt">在&lt;root&gt;标签或单个的&lt;logger&gt;标签里的Appender对象可以用&lt;appender&gt;标签定义。&lt;appender&gt;标签的基本形式如上面所示。它定义了appender的名字和类型。 另外比较重要的是&lt;appender&gt;标签内部的其他标签。不同的appender有不同的&lt;param&gt;标签。在这里，为了使用FileAppender,你需要一个文件名作为参数。另外还需要一个在&lt;appender&gt;标签内部定义一个Layout对象。Layout对象定义在它自己的&lt;layout&gt;标签内。&lt;layout&gt;标签的type属性定义了Layout的类型(在本例里是PatternLayout)，同时也确定了需要提供的参数值。Header和Footer标签提供了一个日志会话(logging session)开始和结束时输出的文字。有关每种appender的具体配置的例子，可以在log4net\doc\manual\example-config-appender.html中得到。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.1.4&nbsp;&nbsp;&nbsp;&nbsp; log4net.Layout.PatternLayout中的转换模式(ConversionPattern)<O:P></O:P> </p>
<p style="font-size: 10pt">%m(message):输出的日志消息，如ILog.Debug(&#8230;)输出的一条消息 </p>
<p style="font-size: 10pt">%n(new line):换行 </p>
<p style="font-size: 10pt">%d(datetime):输出当前语句运行的时刻 </p>
<p style="font-size: 10pt">%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 </p>
<p style="font-size: 10pt">%t(thread id):当前语句所在的线程ID </p>
<p style="font-size: 10pt">%p(priority): 日志的当前优先级别，即DEBUG、INFO、WARN&#8230;等 </p>
<p style="font-size: 10pt">%c(class):当前日志对象的名称，例如： </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 模式字符串为：%<ST1:CHMETCNV w:st="on" unitname="C" sourcevalue="10" hasspace="False" negative="True" numbertype="1" tcsc="0">-10c</ST1:CHMETCNV> -%m%n </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码为： </p>
<p style="font-size: 10pt">ILog log=LogManager.GetLogger(&#8220;Exam.Log&#8221;); </p>
<p style="font-size: 10pt">log.Debug(&#8220;Hello&#8221;); </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; 则输出为下面的形式： </p>
<p style="font-size: 10pt">Exam.Log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Hello </p>
<p style="font-size: 10pt">%L：输出语句所在的行号 </p>
<p style="font-size: 10pt">%F：输出语句所在的文件名 </p>
<p style="font-size: 10pt">%-数字：表示该项的最小长度，如果不够，则用空格填充 </p>
<p style="font-size: 10pt">例如，转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出： </p>
<p style="font-size: 10pt">176 [main] INFO&nbsp; org.foo.Bar - Located nearest gas station. </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.1.5&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<O:P></O:P> </p>
<p style="font-size: 10pt">最后，让我们看看在Appender元素里的&lt;filter&gt;标签。它定义了应用到Appender对象的过滤器。本例中，我们使用了LevelRangeFilter过滤器,它可以只记录LevelMin和LevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器（Filter）,这些过滤器将会按照它们定义的顺序对日志事件进行过滤。其他过滤器的有关信息可以在log4net的SDK文档中找到。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用配置文件<O:P></O:P> </p>
<p style="font-size: 10pt">3.2.1&nbsp;&nbsp;&nbsp;&nbsp; 关联配置文件<O:P></O:P> </p>
<p style="font-size: 10pt">当我们创建了上面的配置文件后，我们接下来需要把它和我们的应用联系起来。缺省的，每个独立的可执行程序集都会定义它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。 </p>
<p style="font-size: 10pt">例如：可以在项目的AssemblyInfo.cs文件里添加以下的语句 </p>
<p style="font-size: 10pt">[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", </p>
<p style="font-size: 10pt">&nbsp; ConfigFileExtension="ext",Watch=true/false)] </p>
<p style="font-size: 10pt">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigFile:指出了我们的配置文件的路径及文件名，包括扩展名。 </p>
<p style="font-size: 10pt">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名，那么我们需要定义这个属性，缺省的，程序集的配置文件扩展名为&#8221;config&#8221;。 </p>
<p style="font-size: 10pt">l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变，重命名，删除等事件。 </p>
<p style="font-size: 10pt">其中：ConfigFile和ConfigFileExtension属性不能同时使用，ConfigFile指出了配置文件的名字，例如，ConfigFile=&#8221;Config.txt&#8221; </p>
<p style="font-size: 10pt">ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名，例如，应用程序的名称是&#8221;test.exe&#8221;,ConfigFileExtension=&#8221;txt&#8221;,则配置文件就应该是&#8221;test.exe.txt&#8221; ； </p>
<p style="font-size: 10pt">也可以不带参数应用DOMConfiguratio(): </p>
<p style="font-size: 10pt">&nbsp;[assembly: log4net.Config.DOMConfigurator()] </p>
<p style="font-size: 10pt">也可以在程序代码中用DOMConfigurator类打开配置文件。类的构造函数需要一个FileInfo对象作参数，以指出要打开的配置文件名。 这个方法和前面在程序集里设置属性打开一个配置文件的效果是一样的。 </p>
<p style="font-size: 10pt">log4net.Config.DOMConfigurator.Configure( </p>
<p style="font-size: 10pt">&nbsp; new FileInfo("TestLogger.Exe.Config")); </p>
<p style="font-size: 10pt">DOMConfigurator 类还有一个方法ConfigureAndWatch(..), 用来配置框架并检测文件的变化。 </p>
<p style="font-size: 10pt">以上的步骤总结了和配置相关的各个方面，下面我们将分两步来使用logger对象。 </p>
<p style="font-size: 10pt">3.2.2&nbsp;&nbsp;&nbsp;&nbsp; 创建或获取日志对象<O:P></O:P> </p>
<p style="font-size: 10pt">日志对象会使用在配置文件里定义的属性。如果某个日志对象没有事先在配置文件里定义，那么框架会根据继承结构获取祖先节点的属性，最终的，会从根日志获取属性。如下所示： </p>
<p style="font-size: 10pt">Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger"); </p>
<p style="font-size: 10pt">3.2.3&nbsp;&nbsp;&nbsp;&nbsp; 输出日志信息<O:P></O:P> </p>
<p style="font-size: 10pt">可以使用ILog的几种方法输出日志信息。你也可以在调用某方法前先检查IsXXXEnabled布尔变量，再决定是否调用输出日志信息的函数，这样可以提高程序的性能。因为框架在调用如ILog.Debug(&#8230;)这样的函数时，也会先判断是否满足Level日志级别条件。 </p>
<p style="font-size: 10pt">if (log.IsDebugEnabled) log.Debug("message"); </p>
<p style="font-size: 10pt">if (log.IsInfoEnabled) log.Info("message); </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序中配置log4net<O:P></O:P> </p>
<p style="font-size: 10pt">除了前面讲的用一个配置文件来配置log4net以外，还可以在程序中用代码来配置log4net框架。如下面的例子: </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">// 和PatternLayout一起使用FileAppender </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator.Configure( </p>
<p style="font-size: 10pt">&nbsp; new log4net.Appender.FileAppender( </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; new log4net.Layout.PatternLayout("%d </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [%t]%-5p %c [%x] - %m%n"),"testfile.log")); </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">// using a FileAppender with an XMLLayout </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator.Configure( </p>
<p style="font-size: 10pt">&nbsp; new log4net.Appender.FileAppender( </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; new log4net.Layout.XMLLayout(),"testfile.xml")); </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">// using a ConsoleAppender with a PatternLayout </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator.Configure( </p>
<p style="font-size: 10pt">&nbsp; new log4net.Appender.ConsoleAppender( </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; new log4net.Layout.PatternLayout("%d </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [%t] %-5p %c - %m%n"))); </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">// using a ConsoleAppender with a SimpleLayout </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator.Configure( </p>
<p style="font-size: 10pt">&nbsp; new log4net.Appender.ConsoleAppender(new </p>
<p style="font-size: 10pt">&nbsp;&nbsp;&nbsp; log4net.Layout.SimpleLayout())); </p>
<p style="font-size: 10pt">尽管这里用代码配置log4net也很方便，但是你却不能分别配置每个日志对象。所有的这些配置都是被应用到根日志上的。 </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator 类使用静态方法Configure 设置一个Appender 对象。而Appender的构造函数又会相应的要求Layout对象。你也可以不带参数直接调用BasicConfigurator.Configure()，它会使用一个缺省的PatternLayout对象，在一个ConsoleAppender中输出信息。如下所示： </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">log4net.Config.BasicConfigurator.Configure(); </p>
<p style="font-size: 10pt">在输出时会显示如下格式的信息： </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">0 [1688] DEBUG log<ST1:CHMETCNV w:st="on" unitname="a" sourcevalue="1" hasspace="True" negative="False" numbertype="1" tcsc="0">1 A</ST1:CHMETCNV> B C - Test </p>
<p style="font-size: 10pt">20 [1688] INFO log<ST1:CHMETCNV w:st="on" unitname="a" sourcevalue="1" hasspace="True" negative="False" numbertype="1" tcsc="0">1 A</ST1:CHMETCNV> B C - Test </p>
<p style="font-size: 10pt">当log4net框架被配置好以后，就可以如前所述使用日志功能了。 </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt"><O:P>&nbsp;</O:P> </p>
<p style="font-size: 10pt">4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结<O:P></O:P> </p>
<p style="font-size: 10pt">使用log4net可以很方便地为应用添加日志功能。应用Log4net，使用者可以很精确地控制日志信息的输出，减少了多余信息，提高了日志记录性能。同时，通过外部配置文件，用户可以不用重新编译程序就能改变应用的日志行为，使得用户可以根据情况灵活地选择要记录的信息。 </p>
</div>
<div style="font-size: 10pt">posted on 2005-03-24 08:17 <a href="http://www.cnblogs.com/dragon/">sema</a> 阅读(2564) <a href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#Post">评论(21)</a> &nbsp;<a href="http://www.cnblogs.com/dragon/admin/EditPosts.aspx?postid=124254">编辑</a>&nbsp;<a href="http://www.cnblogs.com/dragon/AddToFavorite.aspx?id=124254">收藏</a> <a title="功能强大的网络收藏夹，一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐" href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();">收藏至365Key</a> 所属分类: <a href="http://www.cnblogs.com/dragon/category/11625.html">技术研究</a> </div>
<link href="/dragon/Services/Pingback.aspx" rel="pingback" /><!-- <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description rdf:about="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html" dc:identifier="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html" dc:title="Log4Net使用指南" trackback:ping="http://www.cnblogs.com/dragon/services/trackbacks/124254.aspx"  />
</rdf:rdf>
--><a name="评论"><br />
<div id="comments" style="font-size: 10pt">
<h3>评论</h3>
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#124579">#</a>&nbsp;<a name="124579"></a>re: Log4Net使用指南 2005-03-24 09:24 <a id="Comments1_CommentList__ctl0_NameLink" href="http://blog.aspcool.com/donaldxu" target="_blank">Donaldxu</a> </div>
<div style="font-size: 10pt">谢谢，正想研究一下Log4NET，收藏了 <br />
<a id="Comments1_CommentList__ctl0_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl0$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl0_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#124609">#</a>&nbsp;<a name="124609"></a>re: Log4Net使用指南 2005-03-24 09:53 <a id="Comments1_CommentList__ctl1_NameLink" target="_blank">KingofSC</a> </div>
<div style="font-size: 10pt">有一点不明白 <br />
在开始对你的程序进行日志记录前，需要先启动log4net引擎。 <br />
不知道Log4Net是以库的形式附带在应用程序上运行 <br />
还是有自己独立的app引擎？ <br />
<a id="Comments1_CommentList__ctl1_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl1$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl1_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#124614">#</a>&nbsp;<a name="124614"></a>re: Log4Net使用指南 2005-03-24 10:01 <a id="Comments1_CommentList__ctl2_NameLink" href="http://www.alphatom.com/" target="_blank">Samuel</a> </div>
<div style="font-size: 10pt">log4net是一个库，使用的时候要创建一个对象 <br />
<a id="Comments1_CommentList__ctl2_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl2$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl2_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#124629">#</a>&nbsp;<a name="124629"></a>re: Log4Net使用指南 2005-03-24 10:15 <a id="Comments1_CommentList__ctl3_NameLink" target="_blank">KingofSC</a> </div>
<div style="font-size: 10pt">对程序集&#8220;E:\App Tools\Program\DotNet\log4net-1.2.0-beta8\log4net-1.2.0-beta8\src\obj\Release\log4net.dll&#8221;签名时加密失败 --&#8220;读取密钥文件&#8220;..\..\..\log4net.snk&#8221;时出错 -- 系统找不到指定的文件。 &#8221; <br />
<br />
怎么release编译不过 <br />
<a id="Comments1_CommentList__ctl3_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl3$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl3_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#124636">#</a>&nbsp;<a name="124636"></a>re: Log4Net使用指南 2005-03-24 10:21 <a id="Comments1_CommentList__ctl4_NameLink" target="_blank">KingofSC</a> </div>
<div style="font-size: 10pt">哦，原来是强名称的问题 <br />
<a id="Comments1_CommentList__ctl4_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl4$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl4_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#125789">#</a>&nbsp;<a name="125789"></a>re: Log4Net使用指南 2005-03-25 18:30 <a id="Comments1_CommentList__ctl5_NameLink" target="_blank">netwyh</a> </div>
<div style="font-size: 10pt">为什么总报这个错误： <br />
log4net:ERROR No output stream or file set for the appender named []. <br />
<a id="Comments1_CommentList__ctl5_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl5$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl5_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#127406">#</a>&nbsp;<a name="127406"></a>re: Log4Net使用指南 2005-03-28 20:06 <a id="Comments1_CommentList__ctl6_NameLink" href="http://logger的日志级别在配置文件中设置后不起作用？/" target="_blank">netwyh</a> </div>
<div style="font-size: 10pt">&lt;?xml version="1.0" encoding="utf-8" ?&gt; <br />
&lt;log4net&gt; <br />
&lt;root&gt; <br />
&lt;level value="OFF" /&gt; <br />
&lt;appender-ref ref="LogFileAppender" /&gt; <br />
&lt;/root&gt; <br />
&lt;!--&lt;logger name="mytest"&gt; <br />
&lt;appender-ref ref="LogFileAppender" /&gt; <br />
&lt;level value="OFF"/&gt; <br />
&lt;/logger&gt;--&gt; <br />
&lt;appender name="LogFileAppender" <br />
type="log4net.Appender.FileAppender" &gt; <br />
&lt;param name="File" value="log-file.txt" /&gt; <br />
&lt;param name="AppendToFile" value="true" /&gt; <br />
&lt;layout type="log4net.Layout.PatternLayout"&gt; <br />
&lt;param name="ConversionPattern" <br />
value="%d [%t] %-5p %c [%x] &amp;lt;%X{auth}&amp;gt;%n - %m%n" /&gt; <br />
&lt;/layout&gt; <br />
<br />
&lt;/appender&gt; <br />
&lt;/log4net&gt; <br />
<a id="Comments1_CommentList__ctl6_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl6$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl6_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#127407">#</a>&nbsp;<a name="127407"></a>re: Log4Net使用指南 2005-03-28 20:07 <a id="Comments1_CommentList__ctl7_NameLink" target="_blank">netwyh</a> </div>
<div style="font-size: 10pt">日志级别设置不起作用？上面是我的配置文件 <br />
<a id="Comments1_CommentList__ctl7_DeleteLink" href="javascript:__doPostBack('Comments1$CommentList$_ctl7$DeleteLink','')"></a>&nbsp;&nbsp;<a id="Comments1_CommentList__ctl7_EditLink"></a> </div>
</div>
<br />
<div style="font-size: 10pt">
<div style="font-size: 10pt"><a title="permalink: re: Log4Net使用指南" href="http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html#129475">#</a>&nbsp;<a name="129475"></a>re: Log4Net使用指南 2005-03-31 17:30 <a id="Comments1_CommentList__ctl8_NameLink" href="http://www.cnblogs.com/dragon" target="_blank">sema</a> </div>
<div style="font-size: 10pt">很抱歉,这一段时间一直很忙,所以现在才回复.我看你上面的配置文件,猜想可能是你编写配置文件的方式不正确.如果是在WinForm程序里使用,你可以按照这样的步骤: <br />
1.添加log4net引用 <br />
2.为项目新增一个文件,选取新增向导里的"应用程序配置文件",则项目里会增加一个app.config文件.当程序编译后,会在你的执行目录下生成一个&lt;你的程序集名&gt;.exe.config文件内容和本文件一样 <br />
3.编辑app.config文件如下： <br />
&lt;?xml version="1.0" encoding="utf-8" ?&gt; <br />
&lt;configuration&gt; <br />
&lt;configSections&gt; <br />
&lt;section name="log4net" <br />
type="log4net.Config.Log4NetConfigurationSectionHandler, <br />
log4net-net-1.0" <br />
/&gt; <br />
&lt;/configSections&gt; <br />
<br />
<br />
&lt;log4net&gt; <br />
&lt;root&gt; <br />
&lt;level value="ALL" /&gt; <br />
&lt;appender-ref ref="LogFileAppender" /&gt; <br />
&lt;/root&gt; <br />
<br />
&lt;appender name="LogFileAppender" type="log4net.Appender.FileAppender" &gt; <br />
&lt;param name="File" value="log-file.txt" /&gt; <br />
&lt;param name="AppendToFile" value="true" /&gt; <br />
&lt;layout type="log4net.Layout.PatternLayout"&gt; <br />
&lt;param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &amp;lt;%X{auth}&amp;gt;%n - %m%n" /&gt; <br />
&lt;/layout&gt; <br />
&lt;/appender&gt; <br />
&lt;/log4net&gt; <br />
<br />
&lt;/configuration&gt; <br />
这里请注意&lt;configuration&gt; 和&lt;configurations&gt;标签不能少 <br />
4.编辑Assembly.cs文件,添加如下内容: <br />
[assembly:log4net.Config.DOMConfigurator( ConfigFileExtension="config",Watch=true)] <br />
5.在程序里添加如下代码 <br />
log4net.ILog log = log4net.LogManager.GetLogger("MyLogger"); <br />
log.Debug("test"); <br />
<br />
这时你再运行程序,就应该可以看到结果了,我试过如果设置 <br />
level = "OFF",则输出是没有结果的，改成"ALL"是有结果的 <br />
我在文章的开头添加了示例代码下载，你可以参考参考 </div>
</div>
</div>
<img src ="http://www.blogjava.net/jvict/aggbug/227173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jvict/" target="_blank">Documents</a> 2008-09-05 11:32 <a href="http://www.blogjava.net/jvict/articles/227173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#中log4net的使用</title><link>http://www.blogjava.net/jvict/articles/227155.html</link><dc:creator>Documents</dc:creator><author>Documents</author><pubDate>Fri, 05 Sep 2008 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/jvict/articles/227155.html</guid><wfw:comment>http://www.blogjava.net/jvict/comments/227155.html</wfw:comment><comments>http://www.blogjava.net/jvict/articles/227155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jvict/comments/commentRss/227155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jvict/services/trackbacks/227155.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text"><br />
            在C#工程中经常使用log4net.dll来控制log的输出，这种处理对于我们的项目调试特别是<br />
            大型的商业项目的调试带来了很大的好处。近期在做项目的时候使用到了log4net<br />
            现谈一下自己的使用心得。<br />
            对于.net开发尤其是asp.net的开发来说，使用log4net是一个很明智的选择。<br />
            log4net主要包括2个文件：log4net.dll 和log4net.xml。可以从.net framework<br />
            取得相应的文件。<br />
            一个普通应用或者一个asp.net怎样建立关联呢？<br />
            首先需要配置相关的配置文件App.config或Web.config，顾名思义普通应用的配置文件<br />
            为App.config，asp.net的配置文件为Web.config。有关log的配置如下：<br />
            &lt;configuration&gt;<br />
            &nbsp;&nbsp; &lt;configSections&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- log4net的定义 --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /&gt;<br />
            &nbsp;&nbsp; &lt;/configSections&gt;
            <p>&nbsp;&nbsp; &lt;log4net&gt;<br />
            &nbsp;&nbsp; &lt;!-- Console部分log输出格式的设定 --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/appender&gt;</p>
            <p>&nbsp;&nbsp; &lt;!-- 日志文件部分log输出格式的设定 --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;file value="具体的log文件路径名" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appendToFile value="true" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maxSizeRollBackups value="10" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maximumFileSize value="1MB" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rollingStyle value="Size" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;staticLogFileName value="true" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout type="log4net.Layout.PatternLayout"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;header value="[Header] " /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;footer value="[Footer] " /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ConversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/layout&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/appender&gt;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp; &lt;!-- Setup the root category, add the appenders and set the default level --&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;root&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;level value="ALL" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="ConsoleAppender" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appender-ref ref="RollingLogFileAppender" /&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/root&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;/log4net&gt;<br />
            &lt;/configuration&gt;</p>
            <p>其次在项目的AssemblyInfo.cs里面加上[assembly: log4net.Config.XmlConfigurator()]，这样项目工程和log4net就<br />
            建立了关联。<br />
            备注：[assembly: log4net.Config.DOMConfigurator()]这句话的意思是log4net系统会自动寻找配置文件App.config或Web.config<br />
            从而获得并加载其中的配置信息。如果想log4net随时监视配置文件以便重新加载的话就要这样写：<br />
            [assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",ConfigFileExtension="log4net",Watch=true)]</p>
            <p>最后就是源文件中的使用了。<br />
            添加log4net的引用using log4net;<br />
            同时在相关的类中定义log变量如<br />
            &nbsp;&nbsp; protected static readonly log4net.ILog mLog =<br />
            &nbsp;&nbsp;&nbsp; LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);<br />
            log的具体操作，如mLog.Error("this is a test log message!");</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jvict/aggbug/227155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jvict/" target="_blank">Documents</a> 2008-09-05 10:59 <a href="http://www.blogjava.net/jvict/articles/227155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4Net五步走 </title><link>http://www.blogjava.net/jvict/articles/227140.html</link><dc:creator>Documents</dc:creator><author>Documents</author><pubDate>Fri, 05 Sep 2008 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/jvict/articles/227140.html</guid><wfw:comment>http://www.blogjava.net/jvict/comments/227140.html</wfw:comment><comments>http://www.blogjava.net/jvict/articles/227140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jvict/comments/commentRss/227140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jvict/services/trackbacks/227140.html</trackback:ping><description><![CDATA[<div class="postcontent">
<p><a href="http://www.cnblogs.com/cntour365/archive/2008/07/14/1242907.html">http://www.cnblogs.com/cntour365/archive/2008/07/14/1242907.html</a><br />
本文不是教你全面了解log4net,本文只是希望教会你按步就班,照糊芦画瓢般就会用log4net<br />
1,引入log4net.dll组件<br />
2,建立一个配置文件<br />
两种方法,一种是在Web.Config或App.Config里<br />
加入以下配置节<br />
&lt;configSections&gt;<br />
&nbsp;&lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /&gt;<br />
&lt;/configSections&gt;<br />
上面的配置节,复制就可以用了</p>
<p>加入log4net配置内容的定义,这个紧接着上面的内容定义在config文件里就可以了,下面是一个范例:<br />
&lt;log4net&gt;<br />
&nbsp;&lt;root&gt;<br />
&nbsp;&lt;level value="ALL" /&gt;<br />
&nbsp;&lt;appender-ref ref="rollingFile" /&gt;<br />
&nbsp;&lt;/root&gt;</p>
<p>&nbsp;&lt;appender&nbsp; name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" &gt;<br />
&nbsp;&lt;param name="File" value="log.txt" /&gt;<br />
&nbsp;&lt;param name="AppendToFile" value="false" /&gt;<br />
&nbsp;&lt;param name="RollingStyle" value="Date" /&gt;<br />
&nbsp;&lt;param name="DatePattern" value="yyyy.MM.dd" /&gt;<br />
&nbsp;&lt;param name="StaticLogFileName" value="true" /&gt;<br />
&nbsp;&lt;layout type="log4net.Layout.PatternLayout,log4net"&gt;<br />
&nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /&gt;<br />
&nbsp;&nbsp;&lt;param name="Header" value=" ----------------------header-------------------------- " /&gt;<br />
&nbsp;&nbsp;&lt;param name="Footer" value=" ----------------------footer-------------------------- " /&gt;<br />
&nbsp;&lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;&nbsp;<br />
&nbsp;&lt;appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"&gt;&nbsp;<br />
&nbsp;&nbsp;&lt;layout type="log4net.Layout.PatternLayout,log4net"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /&gt;<br />
&nbsp;&nbsp;&lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;&nbsp;<br />
&nbsp;&lt;logger name="Log4NetTest.LogTest"&gt;<br />
&nbsp;&nbsp;&lt;level value="DEBUG" /&gt;<br />
&nbsp;&nbsp;&lt;appender-ref&nbsp; ref="rollingFile" /&gt;<br />
&nbsp;&nbsp;&lt;appender-ref ref="coloredConsoleApp" /&gt;<br />
&nbsp;&nbsp;&lt;appender-ref ref="SystemEvent" /&gt;<br />
&nbsp;&lt;/logger&gt;<br />
&lt;/log4net&gt;<br />
你懒得写的话,复制上面的内容也可以<br />
不过,还是稍做讲解,log4net配置节的XSD层次如下</p>
<p>&lt;log4net&gt;<br />
&nbsp;&lt;root&gt;&lt;level /&gt;&lt;appender-ref ref="" /&gt;&lt;/root&gt;<br />
&nbsp;&lt;appender name="" type="Appender的完全限定类名"&gt;<br />
&nbsp;&lt;param name="" value="" /&gt;<br />
&nbsp;&lt;layout type="log4net.Layout.PatternLayout,log4net"&gt;<br />
&nbsp;&nbsp;&lt;param name="" value="" /&gt;<br />
&nbsp;&lt;/layout&gt;<br />
&nbsp;&lt;/appender&gt;<br />
&nbsp;&lt;logger&gt;<br />
&nbsp;&lt;level value="" /&gt;<br />
&nbsp;&lt;appender-ref ref="" /&gt;<br />
&lt;/logger&gt;<br />
看不懂?其实很简单啦<br />
log4net是log4net配置节的根标记<br />
root标记定义一个根级别的记录者,log4net的记录者采用层级组织的, 两个logger,A的名字叫loggerA,B的名字叫loggerA.B的话,那么B就是A的儿子,B会自动继承A的一些定义,例如LEVEL定义,appender-ref定义等,root就是总的logger,其余定义的logger都是他的后代,都会继承他的设置</p>
<p>包括ROOT在内的每一个LOGGER(ROOT也是一个LOGGER,只不过,他是祖先而已,别的方面,跟其他LOGGER一样),都可以定义Level<br />
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由高往低依次是:<br />
None<br />
Fatal<br />
ERROR<br />
WARN<br />
DEBUG<br />
INFO<br />
ALL</p>
<p>级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处理非常灵活</p>
<p>Logger还有一个配置就是appender-ref了,ref是参照的意思,log4net的架构非常有意思,可扩展性非常高非常值得借鉴,他分为四个要素:<br />
logger<br />
appender<br />
layout<br />
filter</p>
<p>logger是负责日志的记录者<br />
appender提供记录的介质<br />
layout负责把记入的内容格式化<br />
filter负责把内容进行筛选</p>
<p>可以说,整个过程就是一个日志流水线,每个成员负责其中的一个环节<br />
logger发出记录信息,appender接到信息,根据内部的layout配置对记录信息格式化,根据filter决定此信息是否被过滤掉,最后,将其序列化</p>
<p>因此,logger的appender-ref就是定义说,LOGGER要找谁去将内容写入磁盘,流或其他介质,因此,十分重要吧<br />
既然是ref引用,那肯定要定义这个被引用的appender对象了呀</p>
<p>每个appender都代表了一个输出介质<br />
name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质<br />
log4net支持的appender类型有十几种,最常用的有rollingFileAppender,AdoNetAppender,EventLogAppender,FileAppender,分别把日志记入文件,系统日志和数据库<br />
除此之外,appender内的其他参数都用param标记,以key/value形式定义于其内<br />
这里有个小提示,每一个appender,log4net并没有在文档中提出他们需要哪些参数,那么,我们怎么知道呢?<br />
原来,这些param的名称,你可以直接查对应的appender类的属性名即可,例如,使用EventLogAppender时,通过查看类的属性,我们知道其有<br />
LogName,ApplicationName属性,那么,意味着,你可以直接在这个APPENDER的param里加入以下内容:<br />
&lt;param name="LogName" value="Application" /&gt;<br />
&lt;param name="ApplicationName" value="log4netTest" /&gt;</p>
<p>定义了appender的NAME及TYPE属性,以及使用param为其指定参数后,一个appender就建立了,你可以使用他的名字在LOGGER的&lt;appender-ref中去 引用它,那么,引用它的LOGGER在写入日志时,就是写到了APPENDER中定义的介质中去了<br />
一个LOGGER可以引用多个APPENDER,其结果是,同一个日志,被同时记录到多个介质中去 ,便如,同时发邮件,写入系统日志,发送到远程主机.不过,虽然可以这样做,但是还是要小心,因为,会对性能有一定的影响,除非你需要,否则,不要乱用此功能</p>
<p>另外,appender中可以定义可选的layout,layout的定义非常有必要,如果你不想将来看到你的日志会感觉头晕的话,虽然log4net帮你写入日志,但是,日志信息的格式却是我们使用者自行定义的<br />
layout的type参数指定使用哪个类的定义来格式化,常用的有XmlLayout,SimpleLayout,PatternLayout,这个当然要根据你的需要,以及你要产生的格式来选啦,如果你要输出成XML文档格式,你肯定不能用simplelayout吧<br />
layout使用param以KEY/VALUE形式定义其参数<br />
各个Layout类使用的参数当然不一样啦,具体的,你可以去看各个Layout类的属性<br />
其中,PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串<br />
以及可以指定一个Header参数,做为日志开头的字符串,Footer来指定结尾字符串<br />
这里有一个小技巧,日志中开头和结尾总想产生回车符吧,虽然logger在写入一条日志会自动回车,可是Header和FOOTER却不会,咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践,\n\r会原样定改日志,根本不会转换.其实,我们可以用XML实体呀,使用就可以在指定位置插入一个回车换行符了</p>
<p>最后,像log4net的文档中说的那样,如果你不想你的日志文件变得很大,使读写的性能下降的话,建议你还是分级管理日志,把粒度变小点,也就是说,除了定义ROOT外,最后,对每一个模块或每一个实体,依据用途,目的,定义各自的LOGGER配置,这样的好处是日志被分散了,日志文件增长就没那么快了.每一个LOGGER的结构跟ROOT是一模一样的,这里不再叙述了.像前面说的那样,如果你相让日志产生层级关系,你可以跟他们的NAME属性像C#中的namespace那样命名就可以了<br />
要说明的是,LOGGER的定义是非必须的,只是一种建议罢了,Log4net的配置中,除了必须定义一个ROOT和一个APPENDER外,其他的都是可选的</p>
<p>另一种配置log4net的方法,是在单独的XML文件中配置,这个时候,只要把log4net标记中的内容复制过来就行了,不需要configSections</p>
<p>3,在应用程序代码中读取配置<br />
这一步非常简单,你可以在应用程序集的assemblyInfo.cs文件中读取log4net配置<br />
对于WINFORM应用程序,你可以加入<br />
[assembly:log4net.Config.DOMConfigurator()]或<br />
[assembly:log4net.Config.XmlConfigurator()]<br />
对于WEBFORM你可以加入<br />
[assembly:log4net.Config.DOMConfigurator(ConfigFile="web.config",Watch=true)]</p>
<p>注意:如果使用NUNIT测试的朋友,要用生成后事件,copy "$(ProjectDir)app.config" "$(TargetPath).config"</p>
<p>4.在应用程序中获取ILog对象<br />
在需要使用LOGGER功能的类中,引入log4net空间,为类加入静态只读成员(静态的目的是只用一个对象,只读是防止误改)<br />
private static readonly ILog logger=LogManager.GetLogger(typeof(类))<br />
这里就可以获取配置文件中与类名同名的LOGGER对象了</p>
<p>5,写入日志<br />
很简单 logger.Deub(写入的内容)<br />
其他的还有info,warn,error等,很容易理解的</p>
</div>
<img src ="http://www.blogjava.net/jvict/aggbug/227140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jvict/" target="_blank">Documents</a> 2008-09-05 10:28 <a href="http://www.blogjava.net/jvict/articles/227140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>