[英]Log4net buffer not flushing when full in lossy setup
我在 C# webAPI 中使用 Log4net ElasticSearchAppender, BufferSize
為10 , Lossy
設置為true以保持性能,如下所示: https : //github.com/bruno-garcia/log4net.ElasticSearch/wiki/02-Appender-設置
<lossy value="false"/>
Log4net.ElasticSearch 使用緩沖區來收集事件,然后將它們刷新到后台線程上的 Elasticsearch 服務器。 如果緩沖區已滿且尚未刷新,則將此值設置為 true 將導致 log4net.Elasticsearch 開始丟棄事件。 如果 Elasticsearch 服務器無響應或脫機,則可能會發生這種情況。
我還將評估器設置為ERROR
,如果發生 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 條日志(我的緩沖區大小),就不會丟棄任何日志,並且對性能的影響保持在較低水平。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.