2010-03-16 14 views
7

He creado un apéndice de log4net personalizado. Desciende de log4net.Appender.SmtpAppender que desciende de log4net.Appender.BufferingAppenderSkeleton.¿Por qué no está mi buffering log4net buffering?

que programáticamente configuración de los siguientes parámetros en su constructor:

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 

me esperaba esto podría amortiguar 3 eventos de error o superiores y entregar esos eventos cuando se llena la memoria intermedia. Sin embargo, estoy descubriendo que los eventos no están amortiguados en absoluto; en su lugar, SendBuffer() se llama inmediatamente cada vez que se registra un error.

¿Hay algún error en mi configuración?

Gracias

Respuesta

8

Esta línea:

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

cuenta la appender a vaciar el búfer cuando un mensaje con un nivel igual o arriba the evaluator es recibido. Level.Off por lo tanto, bloqueará todos los eventos.

Actualización: después de rastrear sobre la fuente de log4net una vez más No puedo ver por qué el almacenamiento en búfer no funciona para usted.

Update2: que estaba confundido, pero de nuevo, me encontré olvidarse de appenders log4net necesidad de the ActivateOptions a ser llamado después que los ajustes se han cambiado. Hasta que se llame al ActivateOptions, no se crea el búfer cíclico interno y el almacenamiento en búfer no se realizará.

Por lo tanto, hacer una prueba rápida 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); 
     } 
    } 

... y una prueba rápida:

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

pasa la prueba (en mi máquina al menos :).

+1

Según tengo entendido, le indica al encesador que descargue cuando se recibe un mensaje que excede el umbral especificado. http://logging.apache.org/log4net/release/sdk/log4net.Core.LevelEvaluator.html También entiendo que Level.Off es el umbral más alto. http://logging.apache.org/log4net/release/sdk/log4net.Core.Level.Off.html ¿Alguno de estos es incorrecto? – Eric

+0

@Eric: ver mi respuesta actualizada. –

+0

muy bien hecho. Eso está funcionando para mí. Gracias. – Eric

3

Lo que quiere hacer se puede hacer con la siguiente configuración:

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

Mi entendimiento es que Umbral dice log4net cuándo vaciar el búfer (sería también al ras si llegar a la tamaño del búfer). Si desea excluir mensajes del registro, debe usar un filtro. En código esto funciona de la siguiente manera:

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

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

Btw. el buffer está lleno y en el 4º mensaje de error se envían los mensajes. Así que si quieres 3 mensajes sólo en el correo electrónico que tiene que establecer el tamaño del búfer a 2 ...

+0

Hola Stefan. Esto me da el mismo comportamiento. Es decir, los mensajes de error se entregan inmediatamente, en lugar de almacenarse en un búfer. – Eric

+0

eliminaste la línea "Umbral" en tu código? –

+0

Quité la línea de Umbral. – Eric

Cuestiones relacionadas