2012-04-12 75 views
3

如何以編程方式檢查IsEnabledFor是否適用於某個appender過濾器。Log4Net以編程方式檢查Appender過濾器的IsEnabledFor

好的。這是我的配置排序

<log4net> 
<root> 
    <level value="ALL" /> 
    <appender-ref ref="appender" /> 
</root> 

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

<log4net> 

好了,所以如果我設置根>等級要說錯誤的,我做了IsEnabledFor(調試)返回true,但如果我設置根>級別所有和將過濾器添加到appender中,但不考慮過濾器。那麼,如何讓它包含appender過濾器,或者有另一種方法來查詢這個。

謝謝

回答

0

我可能是錯的,但我不明白這是如何輕鬆完成的。你可以做的是這樣的:

var hierarchy = LogManager.GetRepository() as Hierarchy; 
if(hierarchy != null) 
{  
    var appenders = hierarchy.GetAppenders(); 
    foreach(IAppender appender in appenders) 
    { 
     var appenderSkeleton = a as AppenderSkeleton 
     if (appenderSkeleton != null) 
     { 
      IFilter filterHead = appenderSkeleton.FilterHead; 
      // now analyse the filter chain 
     }   
    } 
} 

我沒有測試這個代碼,但它應該或多或少工作。你以這種方式得到的是所有配置過濾器鏈的頭部,所有配件從AppenderSkeleton派生。過濾器鏈的頭部實現IFilter(像所有過濾器),它包含一個方法和屬性:

FilterDecision Decide(LoggingEvent loggingEvent); 
IFilter Next { get; set; } 

現在你可以創建一個日誌級別,你有興趣在一個LoggingEvent的實例,並進入通過使用Next屬性通過過濾器鏈並通過調用FilterDecision來測試每個過濾器。

這就告訴你,如果附加器會接受或拒絕的記錄事件,但你必須要知道,一個appender也可能基於其他標準(例如,消息內容)進行過濾,從而將不完全是一個「IsEnabledFor」實現。

+0

感謝你好。是的,看着那個,並決定不走這條路。沒有想到這將是可能的或簡單的IsEnabled ... – Pintac 2012-04-13 07:24:44

1

我知道這是一箇舊帖子,但Stefan的回答有助於構建以下內容。我的用例是給定操作的自定義日誌記錄級別。顯然我們需要能夠切換這個級別。

在我的特殊情況下,我們只使用LevelMatchFilter這樣我們就不會遇到這些問題,你會與其他濾波器類型...

/// <summary> 
    /// evaulates if a custom log level is enabled. 
    /// </summary> 
    /// <param name="log"></param> 
    /// <param name="level"></param> 
    /// <returns></returns> 
    public static bool IsLevelEnabled(this log4net.ILog log, log4net.Core.Level level) 
    { 
     var hierarchy = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy; 
     if (hierarchy != null) 
     { 
      var appenders = hierarchy.GetAppenders(); 
      foreach (log4net.Appender.IAppender appender in appenders) 
      { 
       var appenderSkeleton = appender as log4net.Appender.AppenderSkeleton; 
       if (appenderSkeleton != null) 
       { 
        log4net.Filter.IFilter filterHead = appenderSkeleton.FilterHead; 
        //traverse the filter chain 
        var currentFilter = filterHead; 
        while (currentFilter.Next != null) 
        { 
         if (currentFilter is log4net.Filter.LevelMatchFilter) 
         { 
          //if the filter level matches the target 
          if (((log4net.Filter.LevelMatchFilter)currentFilter).LevelToMatch == level) 
          { 
           return true; 
          } 
         } 
         //move to the next filter 
         currentFilter = currentFilter.Next; 
        } 
       } 
      } 
     } 
     return false; 
    }