首页 > 解决方案 > 在有损设置中满时 Log4net 缓冲区不刷新

问题描述

我在我的 C# webAPI 中使用 Log4net ElasticSearchAppender,aBufferSize10,并Lossy设置为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 (评估程序)触发的刷新工作正常,但INFO或者DEBUG单独的消息永远不会刷新到 Elastic,即使它们有 10、20 或 100 个。

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

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

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

标签: c#elasticsearchlog4netlog4net-configurationlog4net-appender

解决方案


测试行为后,这是我发现的:

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

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

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

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

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

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

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

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


推荐阅读