2010-03-16 13 views
7

Ho creato un appender log4net personalizzato. Discende da log4net.Appender.SmtpAppender che scende da log4net.Appender.BufferingAppenderSkeleton.Perché il buffer dell'appender di log4net non è il mio?

ho programatically impostare i seguenti parametri nel suo costruttore:

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 

mi aspetto che questo sarebbe tamponare 3 eventi di errore di livello o superiore e fornire quegli eventi quando il buffer è pieno. Tuttavia, sto scoprendo che gli eventi non sono affatto bufferizzati; invece, SendBuffer() viene chiamato immediatamente ogni volta che viene registrato un errore.

C'è un errore nella configurazione?

Grazie

risposta

8

Questa linea:

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

racconta l'appender per svuotare il buffer quando un messaggio con livello uguale o sopra the evaluator è ricevuto. Level.Off bloccherà quindi tutti gli eventi.

Aggiornamento: dopo il tracciamento sul sorgente log4net ancora una volta non riesco a capire perché il buffering non funzioni per voi.

Update2: ero perplesso, ma ancora una volta, mi sono ritrovato a dimenticare appenders log4net necessità per the ActivateOptions di essere chiamato dopo che le impostazioni sono state modificate. Fino a quando viene chiamato ActivateOptions, il buffer ciclico interno non viene creato e il buffering non si verificherà.

Quindi, facendo un test rapido 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); 
     } 
    } 

... e un test rapido:

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

Il test viene superato (sulla mia macchina, almeno :).

+1

La mia comprensione è che dice all'appender di svuotarsi quando viene ricevuto un messaggio che supera la soglia specificata. http://logging.apache.org/log4net/release/sdk/log4net.Core.LevelEvaluator.html Capisco anche che Level.Off è la soglia più alta. http://logging.apache.org/log4net/release/sdk/log4net.Core.Level.Off.html Uno di questi è errato? – Eric

+0

@Eric: guarda la mia risposta aggiornata. –

+0

ben fatto. Questo sta funzionando per me. Grazie. – Eric

3

Che cosa si vuole fare può essere fatto con la seguente configurazione:

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

mia comprensione è che Soglia dice log4net quando per svuotare il buffer (sarebbe anche a filo, se si raggiunge il dimensione buffer). Se si desidera escludere i messaggi dal log, è necessario utilizzare un filtro. In questo codice funziona nel seguente modo:

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

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

Btw. il buffer viene riempito e sul 4 ° messaggio di errore vengono inviati i messaggi. Quindi, se volete 3 messaggi solo nella e-mail è necessario impostare la dimensione del buffer di 2 ...

+0

Ehi, Stefan. Questo mi dà lo stesso comportamento. Cioè, i messaggi di errore vengono consegnati immediatamente, piuttosto che bufferizzati. – Eric

+0

hai rimosso la riga "Soglia" nel tuo codice? –

+0

Ho rimosso la linea Soglia. – Eric

Problemi correlati