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

Eri*_*ric 7 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
Run Code Online (Sandbox Code Playgroud)

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

我的配置有错误吗?

谢谢

Pet*_*old 9

这一行:

this.Evaluator = new log4net.Core.LevelEvaluator(Level.Off);
Run Code Online (Sandbox Code Playgroud)

当收到级别等于或高于求值程序的消息时,告诉appender刷新缓冲区.Level.Off因此将阻止所有事件.

更新:再次跟踪log4net源后,我看不出为什么缓冲不适合你.

Update2:我很难过,但是我再次发现自己忘记了log4net appender需要在更改设置后调用ActivateOptions.直到ActivateOptions被调用时,则不会创建内部循环缓冲区和缓冲不会发生.

所以,做一个快速测试appender:

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

......并快速测试:

    [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));
    }
Run Code Online (Sandbox Code Playgroud)

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