2009-07-23 92 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>