Log4net使用总结,防止自定义的logger和root重复写入日志

摘要:
在log4net的配置中,appender是最重要的部分。一般来说,每个附加程序代表一个日志输出介质,例如日志文件、EvergLog、数据库、控制台、电子邮件、ASP.NET页面等。要了解每个附加程序的参数和选项,请参阅附加程序的SDK文档。以下示例均在下完成。净2.0。log4net的版本为1.2.10。有关AdoNetAppender的详细信息,请参阅log4net.Appender.AdoNetAppenderSDK文档。AdoNetAppender的相关配置内容取决于目标数据库的提供者。以下只是SQL Server 2000的一个示例。

一、在asp.net中使用log4net

1、添加log4net.dll引用

2、编辑配置文件,有两种做法:放在web.config里或放在单独的文件里,我们一般放在单独的文件里,这样做的好处--修改log4net的配置不会影响到整个应用重启

3、在Global.asax的Application_Start里加入如下代码

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~")+@"\log4net.xml"));

log4net.xml为log4net的配置文件,"\log4net.xml"为配置文件相对于站点的路径

4、创建日志对象,一般定义为一个类的私有静态字段

private static readonly ILog log = LogManager.GetLogger(typeof(类名).Name);

5、写日志

if (log.IsDebugEnabled)
{
    log.Debug("日志信息");
}

二、在分层构架中使用log4net

     一般asp.net项目都会使用分层构架,如何在web以外的其它层使用log4net呢,比如DAL层,还要写相应的配置文件吗?

     答案是否定的,在其它层中只要完成上面的1、4、5就行了,不需要再单独进行配置,它会自动沿用web层里的配置信息

三、如何防止自定义的logger和root重复写入日志

    logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢,网上有人提出可以去掉root里的 appender-ref,这不是一个好的解决方法,logger只是为了单独处理一些日志,大部分的日志还是要依靠root来完成。

    其实log4net提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false" 就可以了。

在log4net的配置中,appender是最重要的部分,一般来说,每一种appender都表示一种日志的输出介质,如日志文件、EvengLog、数据库、控制台、邮件、ASP.NET页面等。

本文对各种内置的appender的配置提供了示例,但却远称不上详尽。要想了解每一种appender的参数和选项的说明,请参看该appender的SDK文档。

以下示例都是.NET 2.0下进行的, log4net的版本为1.2.10。

AdoNetAppender

详情参考 log4net.Appender. AdoNetAppender SDK文档

AdoNetAppender的相关配置内容取决于目标数据库的provider。下面仅提供SQL Server 2000的例子。

首先建立数据表:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->CREATE TABLE [dbo].[Log]
 (
    
[Id] [int] IDENTITY (11NOT NULL,
    
[Date] [datetime] NOT NULL,
    
[Thread] [varchar] (255NOT NULL,
    
[Level] [varchar] (50NOT NULL,
    
[Logger] [varchar] (255NOT NULL,
    
[Message] [varchar] (4000NOT NULL,
    
[Exception] [varchar] (2000NULL
)


然后添加配置:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    
<bufferSize value="2" />
    
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" />
    
<connectionString value="server=(local);database=TestBase;integrated security=false;persist security info=True;UID=sa;PWD=" />
    
<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>


bufferSize 表示批处理的日志事件,可以避免每次日志事件都访问数据库;ConnectionType 指定了要使用的IDbConnection的完全限定类型名称;connectionString 表示连接字符串;CommandText 是SQL语句或存储过程;最后一组parameter 节点描述了SQL语句或存储过程需要的参数。

AspNetTraceAppender  

详情参考 log4net.Appender.AspNetTraceAppender SDK 文档

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender" >
    
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    
</layout>
</appender>


这段配置可将日志信息输出到页面的Trace上下文环境。如果日志的级别低于WARN,会以 System.Web.TraceContext.Write方法输出;如果级别为WARN或WARN以上则会以 System.Web.TraceContext.Warn方法输出,下图中的日志信息的不同颜色可以说明这一点。 效果图如下:

Log4net使用总结,防止自定义的logger和root重复写入日志第1张

这在进行页面调试的时候可是很方便的。

BufferingForwardingAppender

详情参考 log4net.Appender.BufferingForwardingAppender SDK 文档

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
    
<bufferSize value="5"/>
    
<lossy value="true" />
    
<evaluator type="log4net.Core.LevelEvaluator">
        
<threshold value="WARN"/>
    
</evaluator>
    
<appender-ref ref="LogFileAppender" />
    
<appender-ref ref="AspNetTraceAppender" />
</appender>


BufferingForwardingAppender的主要作用是将输出到指定类型(这里是LogFileAppender)的 Appender的日志信息进行缓存。bufferSize属性指定了缓存的数量,如果value为5,那么将在信息量达到6条的时候,把这些日志批量输 出。appender-ref属性指定了缓存的Appender类型,同root节点一样,这里可以指定多个。

ColoredConsoleAppender

详情参考log4net.Appender.ColoredConsoleAppender SDK 文档

ColoredConsoleAppender将日志信息输出到控制台。默认情况下,日志信息被发送到控制台标准输出流。下面这个示例演示了如何高亮显示Error信息。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    
<mapping>
        
<level value="ERROR" />
        
<foreColor value="White" />
        
<backColor value="Red, HighIntensity" />
    
</mapping>
    <layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    
</layout>
</appender>


效果如下:
Log4net使用总结,防止自定义的logger和root重复写入日志第2张

还可以为不同的级别指定不同的颜色:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    
<mapping>
        
<level value="ERROR" />
        
<foreColor value="White" />
        
<backColor value="Red, HighIntensity" />
    
</mapping>
    
<mapping>
        
<level value="DEBUG" />
        
<backColor value="Green" />
    
</mapping>
    
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    
</layout>
</appender>


效果如下:

Log4net使用总结,防止自定义的logger和root重复写入日志第3张

ConsoleAppender

详情参考 log4net.Appender.ConsoleAppender SDK 文档

ConsoleAppender将日志信息输出到控制台标准输出流。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    
</layout>
</appender>


EventLogAppender

详情参考 log4net.Appender.EventLogAppender SDK 文档

EventLogAppender将日志写入本地机器的应用程序事件日志中。默认情况下,该日志的源(Source)是AppDomain.FriendlyName,也可以手动指定其它名称。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
    
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    
</layout>
</appender>

FileAppender

详情参考 log4net.Appender.File Appender SDK 文档

FileAppender将日志信息输出到指定的日志文件。

<!-- [if gte vml 1]> <![endif]--><!-- [if !vml]-->

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
    
<param name="File" value="WebUtilClient.log" />
    
<param name="AppendToFile" value="true" />
    
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    
</layout>
</appender>


File指定了文件名称,可以使用相对路径,此时日志文件的位置取决于项目的类型(如控制台、Windows Forms、ASP.NET等);也可以使用绝对路径;甚至可以使用环境变量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到还是覆盖掉已有的日志文件。
还可以添加如下属性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />来使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件。

ForwardingAppender  

详情参考 log4net.Appender.ForwardingAppender SDK 文档

ForwardingAppender可以用来为一个Appender指定一组约束。看下面这个示例:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="ForwardingAppender" type="log4net.Appender.ForwardingAppender" >
    
<threshold value="WARN"/>
    
<appender-ref ref="ConsoleAppender" />
</appender>


在这个示例中,为ConsoleAppender添加了约束,Threshold为WARN。这意味着对于一条日志信息,如果直接使用 ConsoleAppender,那么不论它是什么级别,总会进行输出,而如果使用这个ForwardingAppender,则只有那些WARN或 WARN以上的日志才会发送到ConsoleAppender。 

MemoryAppender

详情参考 log4net.Appender.MemoryAppender SDK 文档

似乎不应该使用配置文件来配置MemoryAppender,但如果你非要这么做,看看这个示例(未验证):

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
    
<onlyFixPartialEventData value="true" />
</appender>


NetSendAppender

详情参考 log4net.Appender.NetSendAppender SDK 文档

NetSendAppender向特定用户的屏幕发送消息(未验证)。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="NetSendAppender" type="log4net.Appender.NetSendAppender">
    
<threshold value="ERROR" />
    
<server value="Anders" />
    
<recipient value="xym" />
    
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    
</layout>
</appender>


OutputDebugStringAppender

详情参考 log4net.Appender.OutputDebugStringAppender SDK 文档 。 

下面这个例子描述了如何配置该Appender以向OutputDebugString API写入日志(未验证)。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender" >
    
<layout type="log4net.Layout.PatternLayout">
        
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    
</layout>
</appender>


RemotingAppender

详情参考 log4net.Appender.RemotingAppender SDK 文档

RemotingAppender向特定的Sink发送日志信息(未验证):

<!-- [if gte vml 1]><![endif]--><!-- [if !vml]-->

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" >
    
<sink value="tcp://localhost:8085/LoggingSink" />
    
<lossy value="false" />
    
<bufferSize value="95" />
    
<onlyFixPartialEventData value="true" />
</appender>

RollingFileAppender

详情参考 log4net.Appender.RollingFileAppender SDK 文档

RollingFileAppender以FileAppender为基础,与后者有着相同的配置选项。

下面这个例子演示了如何配置RollingFileAppender以写入log.txt文件。写入的文件名总是为 log.txt(StaticLogFileName参数指定为true);根据文件大小(RollingStyle)来生成新的文件;最多保存有10个 文件(MaxSizeRollBackups属性,而且一旦写满10个文件,就不再写入日志了),每个文件最大为10KB。这些文件名称为 log.txt.1, log.txt.2…等。

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    
<param name="File" value="log\Log.txt" />
    
<param name="AppendToFile" value="true" />
    
<param name="MaxSizeRollBackups" value="10" />
    
<param name="MaximumFileSize" value="5MB" />
    
<param name="RollingStyle" value="Size" />
    
<param name="StaticLogFileName" value="true" />
    
<layout type="log4net.Layout.PatternLayout">
        
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    
</layout>
</appender>


SmtpAppender

详情参考 log4net.Appender.SmtpAppender SDK 文档

SmtpAppender通过Smtp邮件服务器发送日志信息:

<!-- <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->        <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
            
<authentication value="Basic" />
            
<to value="anderscui@tom.com" />
            
<from value="anderscui@163.com" />
            
<username value="anderscui" />
            
<password value="password" />
            
<subject value="test logging message" />
            
<smtpHost value="smtp.163.com" />
            
<bufferSize value="512" />
            
<lossy value="true" />
border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-c

免责声明:文章转载自《Log4net使用总结,防止自定义的logger和root重复写入日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redhat5.8以光盘、镜像文件配置yumC#在linux上运行实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.Net WinForm下配置Log4Net(总结不输出原因)

最近做一个winform项目,配置了Log4net 但是总是不能输出,搜索了很多文章加上自己的探索发现自己在项目中添加的Log4Net.config 生成时没有被复制到Debug文件夹下, 所以程序在调用日志输出时找不到这个配置文件,所以没有输出(在网上搜了很多,也有很多说是路径问题造成不能输出) 解决办法:1.在项目工程中,选中Log4Net.confi...

C# 开源日志框架配置

一、NLog 注: NLog可以将日志记录在 数据库,文件,控制台, 以下只记录文件日志配置 1.WebAPI分Controller层级打印日志配置 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchem...

Log4net配置

一 AssemblyInfo.cs文件 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 二 创建log4net.config文件 <?xml version="1.0" encoding="utf-8" ?>&...

最火的.NET开源项目(转)

最火的.NET开源项目(转) 综合类 微软企业库微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security)、日志(Logging)、数据访问(Data Access)、配置管理(Configuration Manage)等,并将这些广泛使用的应用程序块集成封装至一个叫企业库的程序包中 CommonLi...

asp.net Log4Net错误日志个人总结

1)创建Global.asax protected void Application_Start(object sender, EventArgs e) { log4net.Config.XmlConfigurator.Configure(); } protected void Application_Error(object sender, Even...

log4net插入access自定义字段

1.创建表格 2.创建log4net.xml,并设置属性始终复制,关键属性 <bufferSize value="1" /> <conversionPattern value="%property{usernm}" />|DataDirectory| 如果是winform,在项目下加个文件夹App_Data然后将access数据...