3

特定のアペンダー フィルター用であることをプログラムで確認するにIsEnabledForはどうすればよいですか。true

これは私の設定です:

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

<root>わかりましたので、レベルを言うように設定ERRORしてIsEnabledFor(デバッグ)を実行すると返されますが、レベルtrueを設定してアペンダーにフィルターを追加すると、フィルターは考慮されません。<root>ALL

アペンダーフィルターを含めるにはどうすればよいですか、またはこれを照会する別の方法はありますか?

4

2 に答える 2

1

私は間違っている可能性がありますが、これを簡単に行う方法がわかりません。あなたができることは次のようなものです:

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(すべてのフィルタと同様に)実装され、1つのメソッドとプロパティが含まれています。

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

LoggingEventこれで、関心のあるログレベルでのインスタンスを作成し、Nextプロパティを使用してフィルターチェーンを通過し、を呼び出して各フィルターをテストできますFilterDecision

これにより、アペンダーがロギングイベントを受け入れるか拒否するかがわかりますが、アペンダーは他の基準(メッセージコンテンツなど)に基づいてフィルタリングする可能性があるため、正確には「IsEnabledFor」実装ではないことに注意する必要があります。

于 2012-04-12T15:15:10.963 に答える