为什么我的log4net appender没有缓冲?

时间:2010-03-16 21:17:47

标签: c# logging log4net

我已经创建了一个自定义的log4net appender。它来自log4net.Appender.SmtpAppender,它来自log4net.Appender.BufferingAppenderSkeleton。

我以编程方式在其构造函数中设置以下参数:

this.Lossy = false;  //don't drop any messages
this.BufferSize = 3; //buffer up to 3 messages
this.Threshold = log4net.Core.Level.Error; //append messages of Error or higher
this.Evaluator = new log4net.Core.LevelEvaluator(Level.Off); //don't flush the buffer for any message, regardless of level

我希望这会缓冲3个级别错误或更高级别的事件,并在填充缓冲区时传递这些事件。但是,我发现事件根本没有缓冲;相反,每次记录错误时都会立即调用SendBuffer()。

我的配置有错吗?

由于

2 个答案:

答案 0 :(得分:9)

这一行:

this.Evaluator = new log4net.Core.LevelEvaluator(Level.Off);

告诉appender在收到级别等于或高于the evaluator的消息时刷新缓冲区。因此Level.Off将阻止所有事件。

再次跟踪log4net源后,

更新:我无法理解为什么缓冲不适合你。

Update2:我很难过,但我又发现自己忘记了在设置更改后调用the ActivateOptions需要的log4net appender。在调用ActivateOptions之前,不会创建内部循环缓冲区,也不会发生缓冲。

所以,快速测试一下:

    public sealed class MyBufferingAppender: BufferingAppenderSkeleton
    {
        public MyBufferingAppender()
        {
            BufferSize = 3;
            ActivateOptions();
        }

        public readonly List<LoggingEvent> SentEvents = new List<LoggingEvent>();
        protected override void SendBuffer(LoggingEvent[] events)
        {
            SentEvents.AddRange(events);
        }
    }

......快速测试:

    [Test]
    public void DoAppend_BuffersEvents()
    {
        var appender = new MyBufferingAppender();

        appender.DoAppend(new LoggingEvent(
           new LoggingEventData {Level = Level.Error, Message = "Hello world"}));

        Assert.That(appender.SentEvents, Has.Count(0));
    }

测试通过(至少在我的机器上:)。

答案 1 :(得分:3)

您可以使用以下配置完成您的工作:

<bufferSize value="3" />
<lossy value="false" />
<filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="ERROR" />
    <levelMax value="FATAL" />
</filter>

我的理解是Threshold告诉log4net何时刷新缓冲区(如果达到缓冲区大小,它也会刷新)。如果要从日志中排除邮件,则需要使用过滤器。在代码中,其工作原理如下:

this.BufferSize = 3;
this.Lossy = false;

var filter = new log4net.Filter.LevelRangeFilter();
filter.LevelMin = log4net.Core.Level.Error;           
this.AddFilter(filter);

顺便说一下。填充缓冲区,并在第4条错误消息上发送消息。因此,如果您只想在电子邮件中添加3条消息,则必须将缓冲区大小设置为2 ...