Log4net appender阈值无法正常工作

Dav*_*ans 12 log4net log4net-configuration

我在我的log4net配置中为我的应用程序设置了一个logfileAppender和一个consoleAppender.我希望logfile appender只写上面的ERROR消息和控制台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>
Run Code Online (Sandbox Code Playgroud)

我发现ERROR和DEBUG都输出到我的logfile appender.如何将其限制为仅ERROR?

Gör*_*een 10

另请注意,level记录器中的标记与thresholda或a的工作方式不同LevelMatchFilter.

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

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

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


Vin*_*jip 6

要为appender进行非常具体的过滤,您需要配置一个LevelMatchFilter或一个LevelRangeFilterfor logfile appender来过滤实际输出的事件.
例如:

<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR"/>
    <levelMax value="FATAL"/>
</filter>
Run Code Online (Sandbox Code Playgroud)

要么

<filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="ERROR"/>
</filter>
Run Code Online (Sandbox Code Playgroud)

把其中一个放在你的<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>
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*agh 5

我已经使用您的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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)