不工作log4net的Appender的门槛(Log4net appender threshold

2019-07-30 16:51发布

我已经成立了一个logfileAppenderconsoleAppender在我的log4net的配置我的应用程序。 我想日志文件附加器只写错误讯息及以上和控制台附加目的地写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>

我发现,这两个错误和调试正在输出到我的日志文件的appender。 如何将其限制为仅错误?

Answer 1:

还需要注意的是level的记录标签不工作的方式相同thresholdLevelMatchFilter

Level指明了记录,实际上将生成的语句。 这是你可以在你的代码测试什么。

Threshold ,另一方面,过滤掉任何低于你的阈值的所有日志信息。

这意味着,具有阈值比所述最高记录水平是没有意义的。 我见过很多次一个如何设置信息的水平(因为这是最追加程序将使用的),然后创建具有DEBUG的阈值的附加目的地。 然后你感到惊讶时没有调试信息的附加器实际上出现...



Answer 2:

要获得非常具体的滤波一个appender,你需要配置LevelMatchFilterLevelRangeFilter的日志文件附加器过滤这实际上是输出的事件。
例如:

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

要么

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

把这些你里面一个<appender>标签,这应该为你工作:

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



Answer 3:

I've created a sample console application using your log4net config and I'm getting the exact behaviour you appear to be wanting....

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");
        }
    }
}

When I run this application, the only thing in the logfile is:

2014-01-27 15:02:51,387 Main - System.Exception: error log statment

And to the screen I see:

2014-01-27 15:05:52,190 System.Exception: error log statment

2014-01-27 15:05:52,218 debug log statment

Here is the entirety of my app.config file:

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


Answer 4:

您收到的答案是部分正确。 该Threshold仅用于设置附加电平的下限。 误差的阈值将实际接收ERROR和致命错误(这是“上方” ERROR)。

你想实现一个LevelMatchFilter与“ERROR”(和“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 这里 )。



Answer 5:

您需要使用加属性。 见这里的一个例子。 您需要定义两个记录器。



文章来源: Log4net appender threshold not working