2010-01-12 11 views
51

Sto utilizzando log4net con AdoNetAppender. Sembra che AdoNetAppender abbia un numero Flush method. C'è comunque posso chiamarlo dal mio codice?Esiste comunque lo svuotamento programmabile del buffer in log4net

Sto cercando di creare una pagina di amministrazione per visualizzare tutte le voci nel registro del database e mi piacerebbe impostare log4net con bufferSize = 100 (o più), quindi voglio che l'amministratore possa fare clic su un pulsante nella pagina di amministrazione per forzare log4net a scrivere le voci del registro memorizzate nel database (senza chiudere log4net).

È possibile?

risposta

79

Supponendo che si sta utilizzando log4net fuori dalla scatola, si può scavare il vostro senso giù & sciacquare l'appender in questo modo:

public void FlushBuffers() 
{ 
    ILog log = LogManager.GetLogger("whatever"); 
    var logger = log.Logger as Logger; 
    if (logger != null) 
    { 
     foreach (IAppender appender in logger.Appenders) 
     { 
      var buffered = appender as BufferingAppenderSkeleton; 
      if (buffered != null) 
      { 
       buffered.Flush(); 
      } 
     } 
    } 
} 

Edit: ho scritto quanto sopra sotto l'ipotesi che hai voluto svuotare gli appendici per uno specifico ILog (probabilmente una cattiva ipotesi ora che rileggo la domanda), ma come Stefan sottolinea in un commento qui sotto, puoi semplificare leggermente il codice se vuoi svuotare tutti gli appendici attraverso l'intero repository come segue:

public void FlushBuffers() 
{ 
    ILoggerRepository rep = LogManager.GetRepository(); 
    foreach (IAppender appender in rep.GetAppenders()) 
    { 
     var buffered = appender as BufferingAppenderSkeleton; 
     if (buffered != null) 
     { 
      buffered.Flush(); 
     } 
    } 
} 
+4

Penso che log4net.LogManager.GetRepository(). GetAppenders(); otterrà tutte le appendici, non importa a quale registratore sono collegate ... –

+0

@Stefan: Ben individuato. Ho aggiornato la mia risposta. Grazie. – Alconja

+5

repository ILoggerRepository = LogManager.GetRepository(); IEnumerable appenders = repository.GetAppenders() .OfType (); foreach (var appender in appenders) appender.Flush(); –

Problemi correlati