zoukankan      html  css  js  c++  java
  • log4net按照不同的【LEVEL】级别输出到不同文件

    Log4net按照不同级别写入多个日志文件

    2012-02-08 15:06 by Fred-Xu, ... 阅读, ... 评论, 收藏, 编辑

    在一个Web应用项目中,我使用了Fluent NHibernate作为数据访问组件,Log4net来做日志记录。实际编码中,主要使用了INFO和ERROR这两个等级来记录日志,如果按照以下Log4net配置:

    <root>
    <level value="ALL"/>
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFileTracer"/>
    </root>


    log4net会把INFO和ERROR的日志记录到同一个日志文件里,Fluent NHibernate的INFO日志会大量存在于该日志文件中,这样一来对日后分析错误日志带来非常之不便,所以就想能不能单独把ERROR级的错误日志记录到一个特定的日志文件里。

    于是开始尝试各种配置来实现这个需要,<root>标签不支持多个<level>,也就没法通过在<root>中配置多个不同级别的日志输入,通过查阅Log4net文档,找到了<Filter>这个标记,配置如下:

    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    </configSections>
    <log4net>
    <!--http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%p %t] [%date{yyyy-MM-dd HH:mm:ss,fff}] %-5l - %m%n"/>
    </layout>
    </appender>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="App_Data/log.log"/>
    <appendToFile value="true"/>
    <maximumFileSize value="5000KB"/>
    <maxSizeRollBackups value="500"/>
    <CountDirection value="1"/>
    <RollingStyle value="Size"/>
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%p %t] [%date{yyyy-MM-dd HH:mm:ss,fff}] %-5logger - %m%n"/>
    </layout>
    </appender>
    <appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender">
    <file value="App_Data/Trace.log"/>
    <appendToFile value="true"/>
    <maximumFileSize value="5000KB"/>
    <maxSizeRollBackups value="500"/>
    <CountDirection value="1"/>
    <RollingStyle value="Size"/>
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%p] %m%n"/>
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR" />
    <levelMax value="FATAL" />
    </filter>
    </appender>
    <root>
    <level value="ALL"/>
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFileTracer"/>
    </root>
    </log4net>

    我们可以看到“RollingFileTracer”中我们通过Filter过滤,只记录范围为ERROR到FATAL,然后在<root>增加该appender,level设置为“ALL”记录所有级别的日志。好了,配置完成,程序实现了记录不同等级的错误信息到多个日志文件。

    参考:http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files

     
     
     

    Logger hierarchy(层次级别)

    Logger都是已经命名的实体。

    Logger的名称区分大小写并遵循以下规则:

    1、如果A logger的名称如果是B logger名称的前缀(通过“.”连接),则说A logger是B logger的祖父级。

    2、如果A logger的名称和B logger的名称之间不存在其他的logger名称,则A logger是B logger的父级。

            例子:A logger名称为“Foo.Bar”,B logger名称为“Foo.Bar.Baz”,A为B的父级。名称为“System”的logger是名称为“System.Text.StringBuilder”的祖父级。

    Root logger位于logger层次级别中的顶级。

    它有例外的三条规则:

    1、Root logger总是存在的。

    2、Root logger不能通过名称或取。

    3、Root logger 有一个默认的Level 值为 Debug。

    Logger 可以通过log4net.LogManager类的静态方法GetLogger获取。

    Level值:ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF

    Level 继承规则:如果一个logger没有定义Level,它的Level值将从它的父级(定义了Level)继承。

    日志纪录请求通过调用logger实例的输出方法实现。

    这些输出方法有Debug,Info,Warn,Error和Fatal。

    通过定义,输出方法决定了日志纪录请求的Level。

    例如,log是一个logger实例,那么语句log.Info(“..”)的日志纪录请求Level为INFO。 如果日志纪录请求的Level比logger本身定义(或继承)的Level高,则请求是可行的,否则不可行。

    简单规则:如果日志记录请求的Level为L,logger本身定义(或继承)Level为K,当L>=K时,日志纪录请求是可行的。

    Level级别:DEBUG <INFO<WARN<ERROR<FATAL

    通过名称,调用log4net.LogManager.GetLogger方法,可以获取同一个logger的实例引用。

    这样在配置了一个logger后,不用在代码中传递引用而可以获取同一个logger的引用了。

    与生物上的亲子关系(父亲总是先于孩子)基本相反,在log4net 里,logger可以被创建和配置成任何顺序。

    特别的是,一个父级logger可能比子级logger后实例化,但却可以在子级中查找到。

  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/xdot/p/6525176.html
Copyright © 2011-2022 走看看