C# Log4net缓冲区不存在';行不通
我正在使用log4net和log4net.Elasticsearch插件(这应该没关系,问题是关于log4net缓冲的),我正在尝试使用缓冲。我不希望每个日志事件都单独发送到Elasticsearch。这是我对appender的配置:C# Log4net缓冲区不存在';行不通,c#,asp.net,log4net,log4net-configuration,log4net-appender,C#,Asp.net,Log4net,Log4net Configuration,Log4net Appender,我正在使用log4net和log4net.Elasticsearch插件(这应该没关系,问题是关于log4net缓冲的),我正在尝试使用缓冲。我不希望每个日志事件都单独发送到Elasticsearch。这是我对appender的配置: <appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch"> <layo
<appender name="ElasticSearchAppender" type="log4net.ElasticSearch.ElasticSearchAppender, log4net.ElasticSearch">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
</layout>
<connectionString value="Server=xxx.xxx.xxx.xxx;Index=api_actions_log;Port=9200"/>
<lossy value="false" />
<bufferSize value="100" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="INFO"/>
</evaluator>
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="My.Namespace.LoggingFilterAttribute" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
If的计算结果为false,所以代码继续使用else,如果:
else if (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent))
this.SendFromBuffer((LoggingEvent) null, this.m_cb);
条件被评估为true,因为我的log4net配置中有evaluator(级别evaluator),并且消息处于正确的级别。SendFromBuffer方法立即将消息发送到存储器(在我的例子中是Elasticsearch)
在分解成log4net代码之后,我不明白缓冲是如何工作的,或者我需要设置什么。在我看来,总是会有一些求值器(至少是级别求值器),所以总是会调用SendFromBuffer方法,从而将每个消息分别发送到存储器。我想知道如何设置log4net以真正使用缓冲区。log4net正在工作:evaluator属性“获取或设置ITriggeringEventEvaluator,该属性导致立即发送缓冲区”
发件人:
Evaluator是由
缓冲AppenderSkeleton以确定是否不应记录日志事件
被缓冲,但不是立即写入/发送。如果评估者
决定活动的重要性,然后决定活动的全部内容
当前缓冲区将与事件一起发送
通常情况下,会设置SmtpAppender来缓冲事件
发送电子邮件的成本可能相对较高。如果
重要事件到来,比如说一个错误,我们希望这样
立即交付,而不是等待缓冲区变为
满满的。这就是评估者的作用,因为它允许我们说:
“当重要事件到达时,不要担心缓冲,只要
马上把你所有的东西都寄过来。”
因此,每一条日志值为
Info
或更高的消息都会触发您的LevelEvaluator
,并导致发送缓冲区。您是否混淆了Evaluator和Filter?计算器是刷新缓冲区的触发器。信息阈值表示只缓冲调试和详细消息。是否要筛选消息?@PanagiotisKanavos是的,谢谢。。。
LoggingEvent loggingEvent1 = this.m_cb.Append(loggingEvent);
if (loggingEvent1 != null)
else if (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent))
this.SendFromBuffer((LoggingEvent) null, this.m_cb);