私は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を設定する方法を知りたいです。
EvaluatorとFilterが混乱しますか? Evaluatorは、バッファをフラッシュするトリガーです。 INFOしきい値は、デバッグメッセージと冗長メッセージだけがバッファリングされていることを意味します。 –
@PanagiotisKanavosはい、ありがとうございます... – Michal