C# Log4net缓冲区在有损设置中满时未刷新
我在我的C#webAPI中使用Log4net ElasticSearchAppender,其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,如果发
缓冲大小
为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>
<evaluator type="log4net.Core.TimeEvaluator">
<interval value="300"/>
</evaluator>