Почему мой log4net appender не буферизует?

Я создал пользовательский 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 () сразу называют каждый раз, когда ошибка зарегистрирована.

В моей конфигурации существует ли ошибка?

Спасибо

7
задан Eric 16 March 2010 в 21:17
поделиться

2 ответа

Эта строка:

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

указывает аппендеру промывать буфер, когда получено сообщение с уровнем, равным или выше оценщика. Level.Off будет блокировать все события.

Обновление: после повторной трассировки источника log4net я не могу понять, почему буферизация не работает у вас.

Update2: Я был в тупике, но снова обнаружил, что забыл о том, что аппендерам log4net необходимо вызывать ActivateOptions после изменения настроек. Пока не будет вызван 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));
    }

Тест проходит (по крайней мере, на моей машине :)).

9
ответ дан 6 December 2019 в 21:12
поделиться

То, что вы хотите сделать, можно сделать с помощью следующей конфигурации:

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

Btw. буфер заполняется и на 4-ом сообщении об ошибке отправляются сообщения. Поэтому, если вы хотите, чтобы в письме было только 3 сообщения, вам нужно установить размер буфера равным 2...

3
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: