C# Log4net缓冲区不存在';行不通

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

我正在使用log4net和log4net.Elasticsearch插件(这应该没关系,问题是关于log4net缓冲的),我正在尝试使用缓冲。我不希望每个日志事件都单独发送到Elasticsearch。这是我对appender的配置:

<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);