2016-06-13 14 views
2

私はlog4net.Elasticsearchプラグインと一緒にlog4netを使用しています(この問題はlog4netの一般的なバッファリングに関するものです)、私はバッファを使用しようとしています。私はすべてのログイベントを別々にElasticsearchに送信する必要はありません。これは、アペンダの私の設定です:Log4netバッファが動作しません

<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" /> 
    </layout> 
    <connectionString value="Server=xxx.xxx.xxx.xxx;Index=api_actions_log;Port=9200"/> 
    <lossy value="false" /> 
    <bufferSize value="100" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="INFO"/> 
    </evaluator> 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
      <loggerToMatch value="My.Namespace.LoggingFilterAttribute" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

あなたは私がbufferSizeの= 100を指定し、一つ一つのメッセージであってもというElasticsearchにすぐに送信見ることができるように。

私は実際にコード内で何が起こっているのか調べようとしていました。 Logメソッドが呼び出されると、ES appenderクラスのAppendメソッドに移動します。この方法は、ベースlog4netのBufferingAppenderSkeletonから継承し、次のようになりますされています。我々は、バッファを使用している場合、それは最初のチェックの方法の初めに

protected override void Append(LoggingEvent loggingEvent) 
{ 
    if (this.m_cb == null || this.m_bufferSize <= 1) 
    { 
    if (this.m_lossy && (this.m_evaluator == null || !this.m_evaluator.IsTriggeringEvent(loggingEvent)) && (this.m_lossyEvaluator == null || !this.m_lossyEvaluator.IsTriggeringEvent(loggingEvent))) 
     return; 
    if (this.m_eventMustBeFixed) 
     loggingEvent.Fix = this.Fix; 
    this.SendBuffer(new LoggingEvent[1] 
    { 
     loggingEvent 
    }); 
    } 
    else 
    { 
    loggingEvent.Fix = this.Fix; 
    LoggingEvent loggingEvent1 = this.m_cb.Append(loggingEvent); 
    if (loggingEvent1 != null) 
    { 
     if (!this.m_lossy) 
     { 
     this.SendFromBuffer(loggingEvent1, this.m_cb); 
     } 
     else 
     { 
     if (this.m_lossyEvaluator == null || !this.m_lossyEvaluator.IsTriggeringEvent(loggingEvent1)) 
      loggingEvent1 = (LoggingEvent) null; 
     if (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent)) 
      this.SendFromBuffer(loggingEvent1, this.m_cb); 
     else if (loggingEvent1 != null) 
      this.SendBuffer(new LoggingEvent[1] 
      { 
      loggingEvent1 
      }); 
     } 
    } 
    else if (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent)) 
     this.SendFromBuffer((LoggingEvent) null, this.m_cb); 
    } 
} 

。答えはyesなので、外側のIfブロックに入ります。そして、それはどんなイベントがバッファから返された場合、バッファと確認するためにイベントを追加します。

LoggingEvent loggingEvent1 = this.m_cb.Append(loggingEvent); 
    if (loggingEvent1 != null) 

偽として評価されている場合ならばそのコードが他と続き:条件があるため、真と評価され

else if (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent)) 
     this.SendFromBuffer((LoggingEvent) null, this.m_cb); 

私は私のlog4netの設定(レベル評価)で評価し、メッセージは適切なレベルにあります。 SendFromBufferメソッドはすぐにメッセージをストレージに送ります(私の場合はElasticsearch)。

このようなlog4netコードの内訳の後、バッファリングがどのように機能するか、セットアップが必要なのか分かりません。常にいくつかの評価者(少なくともレベル評価者)が存在するので、SendFromBufferメソッドは常に呼び出され、すべての単一のメッセージがストレージに別々に送信されるように見えます。私は本当にバッファを使用するlog4netを設定する方法を知りたいです。

+1

EvaluatorとFilterが混乱しますか? Evaluatorは、バッファをフラッシュするトリガーです。 INFOしきい値は、デバッグメッセージと冗長メッセージだけがバッファリングされていることを意味します。 –

+0

@PanagiotisKanavosはい、ありがとうございます... – Michal

答えて

3

log4netのはas documentedに取り組んでいる:評価者のプロパティ「がすぐ送信するバッファを引き起こすことITriggeringEventEvaluatorを取得または設定します。」 this explanationから

評価者は、ロギングイベントが がすぐに送信/バッファリングされ、代わりに書かれるべきではないかどうかを判断するために BufferingAppenderSkeletonで使用されているプラ​​グイン可能なオブジェクトです。評価器 がイベントが重要であると判断した場合、現在のバッファーの内容全体がイベントとともに送信されます。

通常、SmtpAppenderは、メールを送信するコストが比較的高い可能性があるので、 送信前にイベントをバッファリングするように設定されます。 という重大なイベントが到着した場合、たとえばERRORの場合は、バッファが になるのを待つのではなく、 がすぐに配信されるようにします。これは評価者が来るところです: 「重要なイベントが到着したときにバッファリングを心配しないで、ちょうど あなたが今持っているものをすべて送信してください」。

のでInfo以上のログlovelを持つすべてのメッセージは、あなたのLevelEvaluatorをトリガし、バッファが送信されます。

関連する問題