c# - 在有损设置中满时 Log4net 缓冲区不刷新
问题描述
我在我的 C# webAPI 中使用 Log4net ElasticSearchAppender,aBufferSize
为10,并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 个。
在此配置中缓冲区已满时永远不会刷新,它只是不断丢弃DEBUG
或INFO
记录直到ERROR
出现,即使 Elastic 在线并且响应完美。
注意:我尝试设置lossy
为 false,缓冲区满时刷新。但我担心这会严重损害我的应用程序响应能力。
我有什么问题吗?有没有更好的方法来记录,同时最大限度地减少对性能的影响?
解决方案
测试行为后,这是我发现的:
当为真时,缓冲区变满永远不会触发刷新。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 条日志(我的缓冲区大小),就不会丢弃任何日志,并且对性能的影响保持在较低水平。
推荐阅读
- html - 更改文件夹后找不到图像
- ansible - 如何在发布期间使用 Ansible 匹配特定文件?
- spring - 如何在春季批处理中用 openCSV 替换 flatFileItemReader
- reactjs - React JS无法渲染图像
- postgresql - 为什么此查询使用了错误的索引?
- reactjs - 注册调用期间带有 Reactjs 应用程序的 AWS Cognito 错误 - 结构或地图的开始位置在预期之外
- jsp - Bootstrap 在 JSP 上工作,但在通过 servlet 请求 JSP 时不工作
- java - 有没有办法在没有静态变量 JAVA 的情况下将数据从一个函数“传输”到另一个函数?
- flutter-desktop - 任务 ':app:compileFlutterBuildDebug' 执行失败。我该如何纠正这个问题?
- c# - Linq中的多个空外键组加入错误