elasticsearch,log4net,log4net-configuration,log4net-appender,C#,elasticsearch,Log4net,Log4net Configuration,Log4net Appender" /> elasticsearch,log4net,log4net-configuration,log4net-appender,C#,elasticsearch,Log4net,Log4net Configuration,Log4net Appender" />

C# Log4net缓冲区在有损设置中满时未刷新

C# Log4net缓冲区在有损设置中满时未刷新,c#,elasticsearch,log4net,log4net-configuration,log4net-appender,C#,elasticsearch,Log4net,Log4net Configuration,Log4net Appender,我在我的C#webAPI中使用Log4net ElasticSearchAppender,其缓冲大小为10且有损设置为true以保持性能,如下所示: Log4net.ElasticSearch使用缓冲区收集数据 事件,然后将其刷新到后台的Elasticsearch服务器 线将此值设置为true将导致log4net.Elasticsearch 如果缓冲区已满且尚未删除,则开始丢弃事件 脸红了。如果Elasticsearch服务器变为 无响应或脱机 我还将evaluator设置为ERROR,如果发

我在我的C#webAPI中使用Log4net ElasticSearchAppender,其
缓冲大小
10
有损
设置为true以保持性能,如下所示:

Log4net.ElasticSearch使用缓冲区收集数据 事件,然后将其刷新到后台的Elasticsearch服务器 线将此值设置为true将导致log4net.Elasticsearch 如果缓冲区已满且尚未删除,则开始丢弃事件 脸红了。如果Elasticsearch服务器变为 无响应或脱机

我还将evaluator设置为
ERROR
,如果发生错误,将强制刷新缓冲区

以下是相关的配置文件:

<?xml version="1.0"?>
<log4net>
    <appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch">
    <threshold value="ALL" />
    <layout type="log4net.Layout.PatternLayout,log4net">
      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
    </layout>
    <connectionString value="Server=my-elasticsearch-server;Index=foobar;Port=80;rolling=true;mode=tcp"/>
    <lossy value="true" />
    <bufferSize value="10" />
    <evaluator type="log4net.Core.LevelEvaluator">
      <threshold value="ERROR" />
    </evaluator>
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="ElasticSearchAppender" />
  </root>
</log4net>

以下是我的行为: 由错误(计算器)触发的刷新工作正常,但仅
INFO
DEBUG
消息不会刷新到Elastic,即使有10、20或100条消息

在这种配置中,缓冲区在满时从不刷新,它只是不断丢弃
DEBUG
INFO
日志,直到出现
错误
,即使Elastic在线且响应良好

注意:我尝试将
lossy
设置为false,缓冲区满时会刷新。但我担心这会严重损害我的应用程序响应能力

我有什么不对劲吗?
有没有更好的方法来记录日志,同时最大限度地降低性能影响?

在测试行为后,我发现:

lossy
为真时,缓冲区变满不会触发刷新

作者的文章对有损财产有相当大的误导性,尤其是这句话:

如果缓冲区已满(…),将此值设置为true将导致(…)开始丢弃事件。如果Elasticsearch服务器无响应或脱机,则可能发生这种情况。

事实上,这与appender/Elastic无响应无关:在有损配置中,只有计算器才会触发缓冲区刷新:

  • 如果发生某个杠杆的事件(例如:致命或错误),级别计算器将刷新,给出崩溃的上下文(=崩溃前发生的最后日志)

    
    
  • 如果经过某个时间间隔,时间计算器将刷新

    <evaluator type="log4net.Core.TimeEvaluator">
        <interval value="300"/>
    </evaluator>
    
    
    
出于我的目的,我最终决定配置一个间隔为5分钟的TimeEvaluator。 这样,只要每5分钟不超过200个日志(我的缓冲区大小),就不会丢弃任何日志,对性能的影响也会很低

<evaluator type="log4net.Core.TimeEvaluator">
    <interval value="300"/>
</evaluator>