【问题标题】:Log4net - modify logging levels for individual logger and appender combinationsLog4net - 修改单个 logger 和 appender 组合的日志级别
【发布时间】:2015-07-09 00:34:49
【问题描述】:

我有两个附加程序,一个 (InfoAppender) 带有 levelMin 信息过滤器,一个 (DebugAppender) 没有过滤器。这很好用。我还可以使用该元素为单个记录器设置最低记录级别。但是现在我想让大多数记录器将信息(及以上)记录到 InfoAppender 并将调试(及以上)记录到 DebugAppender,但是某个聊天记录器(NHibernate)将警告(及以上)记录到 InfoAppender 并将信息(及以上)记录到 DebugAppender。

我查看了Log4Net Logging of two different levels to two different appenders for the same logger 中提供的解决方案,但它对我不起作用。我有以下配置:

<log4net>
  <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Logs\" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="'Info.'yyyy-MM-dd'.log.txt'"/>
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO" />
    </filter>
  </appender>
  <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Logs\" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="'Debug.'yyyy-MM-dd'.log.txt'"/>
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <logger name="NHibernate" additivity="false">
    <appender-ref ref="InfoAppender">
      <threshold value="WARN" />
    </appender-ref>
    <appender-ref ref="DebugAppender">
      <threshold value="INFO" />
    </appender-ref>
  </logger>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="InfoAppender" />
    <appender-ref ref="DebugAppender" />
  </root>
</log4net>

我有以下测试代码:

        XmlConfigurator.Configure();
        var logger1 = LogManager.GetLogger("Program");
        var logger2 = LogManager.GetLogger("NHibernate");
        logger1.Debug("Debug message");
        logger2.Debug("Debug message");
        logger1.Info("Info message");
        logger2.Info("Info message");
        logger1.Warn("Warn message");
        logger2.Warn("Warn message");

但两条调试消息都记录到 DebugAppender,两条信息消息都记录到 InfoAppender。

【问题讨论】:

    标签: log4net


    【解决方案1】:

    log4net 的配置机制很宽松,但不会告诉你什么时候不考虑某些参数。例如,在您的配置中,以下引用了 appender InfoAppender 但 threshold 属性没有做任何事情

     <appender-ref ref="InfoAppender">
        <threshold value="WARN" />
      </appender-ref>
    

    appender-ref 节点下的 xml 元素不会被解析,你可以放任何它不会被考虑在内的东西:

    protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot)
    // some code ommited
            if (xmlElement.LocalName == "appender-ref")
            {
                IAppender appender = this.FindAppenderByReference(xmlElement);
                string attribute = xmlElement.GetAttribute("ref");
                if (appender != null)
                {
                    LogLog.Debug(string.Concat(new string[]
                    {
                        "XmlHierarchyConfigurator: Adding appender named [",
                        attribute,
                        "] to logger [",
                        log.Name,
                        "]."
                    }));
                    log.AddAppender(appender);
                }
                else
                {
                    LogLog.Error("XmlHierarchyConfigurator: Appender named [" + attribute + "] not found.");
                }
            }
    

    您需要在 logger 和最终 appender 之间添加一个过滤器。为此,我建议使用ForwardingAppender,它可以让您在附加程序之间传递日志事件,同时添加一些行为:将配置文件的 NHibernate 部分更改为:

    <appender name="NHibernateDebugFilterAppender" type="log4net.Appender.ForwardingAppender">
      <appender-ref ref="DebugAppender"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
      </filter>
    </appender>
    
    <appender name="NHibernateInfoFilterAppender" type="log4net.Appender.ForwardingAppender">
      <appender-ref ref="InfoAppender"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="WARN" />
      </filter>
    </appender>
    
    <logger name="NHibernate" additivity="false">
      <appender-ref ref="NHibernateInfoFilterAppender" />
      <appender-ref ref="NHibernateDebugFilterAppender"/>
    </logger>
    

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多