在有损设置中满时 Log4net 缓冲区不刷新

Log4net buffer not flushing when full in lossy setup

我在我的 C# webAPI 中使用 Log4net ElasticSearchAppender,BufferSize10Lossy 设置为 true 以保持性能,如下所示: https://github.com/bruno-garcia/log4net.ElasticSearch/wiki/02-Appender-Settings

<lossy value="false"/>Log4net.ElasticSearch uses a buffer to collect events and then flush them to the Elasticsearch server on a background thread. Setting this value to true will cause log4net.Elasticsearch to begin discarding events if the buffer is full and has not been flushed. This could happen if the Elasticsearch server becomes unresponsive or goes offline.

我还将求值器设置为 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>

这是我得到的行为: 由 ERROR(评估器)触发的刷新工作正常,但单独 INFODEBUG 消息 永远不会刷新到 Elastic,即使有 10、20 , 或其中的 100 个。

在此配置中,缓冲区在满时永远不会刷新,它只是不断丢弃 DEBUGINFO 日志,直到出现 ERROR,即使 Elastic 在线且响应完美.

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

我是不是搞错了什么? 有没有更好的日志记录方式,同时最大限度地减少对性能的影响?

测试行为后,我发现了以下内容:

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

Bruno garcia的文章对Lossy属性的文章误导了很多,尤其是这句话:

Setting this value to true will cause (...) to begin discarding events if the buffer is full (...). This could happen if the Elasticsearch server becomes unresponsive or goes offline.

事实上,它与 appender/Elastic 无响应无关:在有损配置中,只有评估程序会触发缓冲区的刷新:

  • 级别评估器,如果某个级别的事件发生(例如:FATAL 或 ERROR),将刷新,给出崩溃的上下文(=崩溃前发生的最后日志)。

    <evaluator type="log4net.Core.LevelEvaluator">
        <threshold value="ERROR"/>
    </evaluator>
    
  • 如果经过特定的时间间隔,时间计算器将刷新

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

出于我的目的,我最终决定配置一个间隔为 5 分钟的 TimeEvaluator。 这样,只要每 5 分钟不超过 200 条日志(我的缓冲区大小),就不会丢弃任何日志,并且对性能的影响保持在较低水平。