2009-07-23 90 views
12

我在我的应用程序的log4net配置中设置了logfileAppenderconsoleAppender。我想日志文件appender只写ERROR消息和以上和控制台appender写DEBUG和以上。Log4net appender阈值不起作用

我的配置是:

<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。如何将其限制为仅ERROR?

+0

你尝试我在答复建议的过滤器?它没有区别? – 2009-07-23 15:45:19

+0

我已经使用你的log4net配置创建了一个示例控制台应用程序,并且我看到了你想要的确切行为....请参阅下面的答案。 – Darragh 2014-01-28 13:11:58

回答

8

还要注意,记录器中的level标记与thresholdLevelMatchFilter不一样。

Level指示实际将生成的日志语句。这是你可以在你的代码中测试的东西。

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

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

6

要获得appender的特定筛选,您需要为日志文件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。

+0

@ Dav.evans,你能确认以上是完整的配置吗?你在用什么记录仪?代码中是否确定没有编程改变配置? – 2009-07-23 15:25:48

+0

同样的问题/答案:http://stackoverflow.com/questions/6007/log4net-configuring-log-level – 2011-03-26 22:36:51

2

您收到的答案部分正确。 Threshold仅用于设置附加级别的下限。 ERROR的阈值实际上会接收ERROR和FATAL(这是“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的问题)。

4

我使用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年1月27日15:02:51387主 - System.Exception的:错误日志statment

而且屏幕我看到:

2014年1月27日15:05:52190的System.Exception:错误日志statment

2014年1月27日15:05:52218调试日志statment

这里是我的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>