`
guowee
  • 浏览: 176752 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • .NET
阅读更多

一、在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  ( 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
)


然后添加配置:

 

<!-- <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方法输出,下图中的日志信息的不同颜色可以说明这一点。 效果图如下:



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

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 >


效果如下:


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

<!-- <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 >


效果如下:



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
分享到:
评论

相关推荐

    C# 利用log4net 把日志写入到数据库

    通过log4net,C#开发者可以轻松地将日志信息写入到数据库,便于后期的数据分析和问题排查。合理配置和使用log4net,不仅能提高开发效率,还能确保系统的稳定性和可靠性。在实际项目中,可以根据具体需求调整log4net...

    .Net 使用Log4Net 获取系统日志并写入数据库

    总结起来,通过Log4Net,我们可以方便地在.NET应用中捕获异常信息并将其存储到数据库中,便于后期分析和调试。Log4Net的灵活性和可配置性使其成为.NET开发中不可或缺的工具,帮助开发者实现高效、可靠的日志记录。在...

    log4net保存日志到MySql数据库

    本文将深入探讨如何使用log4net将日志保存到MySQL数据库,并涉及日志加密和调试日志的使用。** ### 1. log4net简介 Log4net是Apache软件基金会的开源项目,它是.NET平台上的一个强大的日志记录工具,提供灵活的...

    log4j使用与java中log4j记录日志如何写入数据库

    本文将详细介绍如何在Java中使用Log4j来记录日志,并将其写入数据库。 首先,我们需要了解Log4j的基本结构。一个简单的Log4j项目通常包含以下几个部分: 1. **配置文件**:Log4j的配置文件通常是`log4j.properties...

    golang环境的log4go日志器(需配合loggor使用)

    总结来说,Log4go和Loggor结合使用,可以提供一套高效、灵活的日志解决方案,满足Golang开发中的各种日志需求。通过配置和定制,开发者可以轻松地管理非业务日志,保证系统的稳定运行,同时方便后期的问题排查和优化...

    Wpf log4net 日志

    在上面的例子中,`log.Error`方法用于记录异常信息,如果发生错误,会将错误信息和堆栈跟踪写入日志文件。同样,你可以使用`log.Fatal`, `log.Warn`, `log.Info`, `log.Debug`等方法记录不同级别的日志信息。 通过...

    Log4net详细说明使用

    总结起来,Log4net提供了一套灵活的日志管理机制,包括日志级别的设定、多种输出方式、自定义日志格式等功能。通过合理配置和使用,开发者可以在开发过程中有效地追踪和分析问题,提高开发效率和软件质量。在实际...

    log4net配置,日志纪录log4j的.NET版

    除了基本配置外,log4net还支持自定义Appenders和Layouts,可以将日志写入数据库、网络、自定义日志文件等。此外,还可以通过过滤器控制哪些日志条目应被记录,或者使用不同的日志格式。 **6. 结论** Log4net作为...

    Log4Net使用demo Log4Net.dll

    这个"Log4Net使用demo Log4Net.dll"压缩包包含了一个实例化的演示项目,帮助用户了解如何在自己的应用程序中集成和配置Log4Net。 首先,Log4Net的核心理念是层次化的日志记录,它允许你将日志信息分为不同的级别,...

    Log4Net日志

    总结来说,Log4Net提供了强大的日志记录功能,通过灵活的配置和丰富的API,可以轻松地集成到C#项目中,帮助开发者实现高效、准确的日志管理。在日常开发中,熟练掌握Log4Net能大大提高问题排查效率,是每个.NET...

    C#Log4net操作记录错误

    配置Log4net时,我们可以在`&lt;configuration&gt;`节点下添加`&lt;log4net&gt;`节点,然后设置日志输出的目标、级别和格式。例如,如果我们希望将日志记录到文本文件,可以这样配置: ```xml &lt;log4net&gt; ...

    C#使用log4net记录日志

    4. **使用log4net记录日志**:在需要记录日志的地方,通过静态`Log`类获取logger实例,然后调用相应的方法。例如: ```csharp private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); ...

    log4Net使用方法介绍

    **log4Net使用方法介绍** **一、log4Net简介** log4Net是Apache软件基金会的Jakarta项目下的一个开源日志框架,适用于.NET Framework。它提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,...

    log4net使用实例

    **log4net使用实例** log4net是一款广泛应用于.NET Framework中的日志记录工具,它源自Java的log4j,由Apache软件基金会开发。这个插件提供了强大的日志记录功能,支持多种日志输出方式,包括控制台、文件、数据库...

    log4net写入oracle的配置

    在IT行业中,日志记录是系统管理和故障排查的关键部分,而`log4net`作为.NET框架下广泛使用的日志组件,能帮助开发者方便地记录应用程序的运行情况。本配置主要介绍如何将`log4net`的日志信息写入Oracle数据库,以...

    log4net 简单的日志系统

    `log4net`是Apache软件基金会的一个开源项目,它是.NET平台上广泛使用的日志框架之一,提供了一种灵活且强大的日志记录解决方案。 **log4net的基本概念** 1. **配置**: `log4net` 的配置可以通过XML、属性文件或者...

    log4net C#日志类

    - **创建和使用日志器**: 使用`log4net.LogManager.GetLogger()`获取日志器实例,然后调用其`Debug()`, `Info()`, `Warn()`, `Error()`, `Fatal()`等方法记录日志。 ### 3. 示例配置与使用 ```xml ...

    log4net web,winform demo

    总结,log4net作为.NET开发中不可或缺的工具,为Web和WinForm应用提供了强大的日志管理和分析能力。通过深入理解和灵活运用,开发者可以更好地监控应用程序,定位并解决问题,从而提升软件质量和稳定性。在实际项目...

    log4Net.dll+使用详解

    log4net的配置主要通过XML配置文件完成,其中包括定义日志输出的目标(appender)、日志级别(level)和日志布局(layout)。例如,你可以设置将日志输出到控制台、文件、数据库甚至电子邮件。以下是一个基本的配置...

    log4net的配置详解

    **log4net配置详解** 在C#开发中,日志记录是...在Fujitsu.HOPE.LifeMarkVoice.Client项目中,可能需要针对服务端和客户端的不同情况配置log4net,确保日志记录全面且有序,帮助团队在开发和维护过程中快速定位问题。

Global site tag (gtag.js) - Google Analytics