【问题标题】:Log4net buffer not flushing when full in lossy setup在有损设置中满时 Log4net 缓冲区不刷新
【发布时间】:2020-03-28 08:31:29
【问题描述】:

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

<lossy value="false"/>Log4net.ElasticSearch 使用缓冲区收集 事件,然后在后台将它们刷新到 Elasticsearch 服务器 线。将此值设置为 true 将导致 log4net.Elasticsearch 如果缓冲区已满且尚未完成,则开始丢弃事件 酡。如果 Elasticsearch 服务器变为 无响应或离线。

我还将评估器设置为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,缓冲区满时会刷新。但我担心这会严重损害我的应用程序响应能力。

我有什么问题吗? 有没有更好的方法来记录,同时最大限度地减少对性能的影响?

【问题讨论】:

    标签: c# elasticsearch log4net log4net-configuration log4net-appender


    【解决方案1】:

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

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

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

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

    事实上,这与 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 条日志(我的缓冲区大小),就不会丢弃任何日志,并且对性能的影响保持在较低水平。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-03
      • 2013-11-29
      • 2013-02-04
      • 2011-10-18
      • 2011-12-03
      • 2015-08-10
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多