【问题标题】:Log4net appender threshold not workingLog4net appender 阈值不起作用
【发布时间】:2010-11-13 08:43:44
【问题描述】:

我在我的 log4net 配置中为我的应用程序设置了 logfileAppenderconsoleAppender。我希望 logfile appender 只写 ERROR 消息及以上,console appender 写 DEBUG 及以上。

我的配置是:

<log4net debug="false">

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
  <param name="File" value="log.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout,log4net">
    <param name="ConversionPattern" value="%d %M - %m%n" />
  </layout>
  <threshold value="ERROR"/>
</appender>

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d %m%n" />
  </layout>
</appender>


<root>
  <priority value="DEBUG" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="LogFileAppender" />
</root>

</log4net>

我发现 ERROR 和 DEBUG 都被输出到我的日志文件附加程序。如何将其限制为仅 ERROR?

【问题讨论】:

  • 您是否尝试过我在回答中建议的过滤器?没有区别吗?
  • 我已经使用您的 log4net 配置创建了一个示例控制台应用程序,并且我得到了您似乎想要的确切行为....请参阅下面的答案。

标签: log4net log4net-configuration


【解决方案1】:

还要注意,记录器中的level 标记与thresholdLevelMatchFilter 的工作方式不同。

Level 表示实际将生成哪些日志语句。这是您可以在代码中测试的内容。

另一方面,Threshold 会过滤掉所有低于阈值的日志消息。

这意味着使用高于最高记录器级别的阈值是没有意义的。我已经多次看到如何设置一个 INFO 级别(因为这是大多数附加程序将使用的),然后创建一个具有 DEBUG 阈值的附加程序。然后,当 appender 上实际上没有出现 DEBUG 消息时,您会感到惊讶......

【讨论】:

  • 听起来你已经回答了问题的反面?该问题具有调试级别/优先级和错误阈值。
【解决方案2】:

要对附加程序进行非常具体的过滤,您需要为日志文件附加程序配置LevelMatchFilterLevelRangeFilter 以过滤实际输出的事件。
例如:

<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR"/>
    <levelMax value="FATAL"/>
</filter>

<filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="ERROR"/>
</filter>

将其中之一放入您的 &lt;appender&gt; 标记中,这应该适合您:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
    <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="ERROR"/>
    </filter>
    <param name="File" value="log.txt" />
    <param name="AppendToFile" value="true" />
    <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d %M - %m%n" />
    </layout>
    <threshold value="ERROR"/>
</appender>

注意:已更新以删除 kgiannakakis 指出的错误。

【讨论】:

【解决方案3】:

我已经使用您的 log4net 配置创建了一个示例控制台应用程序,并且我得到了您似乎想要的确切行为....

using System;
using System.IO;
using log4net;
using log4net.Config;

namespace SO_1171258
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));
        
        static void Main()
        {
            XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString()));
            log.Error(new Exception("error log statment"));
            log.Debug("debug log statment");
        }
    }
}

当我运行这个应用程序时,日志文件中唯一的内容是:

2014-01-27 15:02:51,387 Main - System.Exception:错误日志声明

在我看到的屏幕上:

2014-01-27 15:05:52,190 System.Exception: 错误日志声明

2014-01-27 15:05:52,218 调试日志声明

这是我的 app.config 文件的全部内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net debug="false">

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d %M - %m%n" />
      </layout>
      <threshold value="ERROR"/>
    </appender>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"   >
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d %m%n" />
      </layout>
    </appender>


    <root>
      <priority value="DEBUG" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="LogFileAppender" />
    </root>

  </log4net>
</configuration>

【讨论】:

    【解决方案4】:

    您收到的答案部分正确。 Threshold 仅用于设置附加级别的下限。 ERROR 的阈值实际上会收到 ERROR 和 FATAL(即“高于”ERROR)。

    您确实想实现一个级别值为“ERROR”的LevelMatchFilter(另一个附加程序为“DEBUG”)。但是,您还必须在过滤器链的末尾添加 DenyAllFilter
    例如:

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d %M - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelMatchFilter">
        <levelToMatch value="ERROR" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
    

    自 log4net 1.2.10 以来,我必须实现 DenyAllFilter(你可以看到我在这个主题上遇到的问题 here)。

    【讨论】:

    • Maestrean 这对我最新版本的 log4net 不起作用。
    • 不管多少岁,你都是我的英雄!
    【解决方案5】:

    您需要使用additivity 属性。有关示例,请参阅here。您需要定义两个记录器。

    【讨论】:

    • 但是logfile是一个Appender,可加性属于Loggers。
    • 我已经更正了这一点。您实际上创建了两个记录器,每个记录器都有一个附加程序并使用可加性属性。
    • 肯定不是。那么阈值元素的作用是什么?
    • 你试过了吗? LogFileAppender 默认继承其父(根)appender,因此默认打印 DEBUG 消息。尝试将 root 的优先级设置为 ERROR,看看会发生什么。
    • @kgiannakakis,这是不对的 - 记录器不是 Appender。由于 appender 附加到根 logger,因此在每个 logger 上记录的事件将由这些 appender 处理,除非特定 logger 的可加性设置为 false,在这种情况下,该 logger 及以下记录的事件将不被处理。在这种情况下,appender 的阈值应该可以工作 - 这让我觉得也许不是所有的信息都已经发布了?
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多