2010-01-12 3 views
51

Estoy usando log4net con AdoNetAppender. Parece que AdoNetAppender tiene un Flush method. ¿Hay alguna forma de llamarlo desde mi código?¿Hay alguna forma de enjuagar el búfer de forma programable en log4net

Estoy tratando de crear una página de administrador para ver todas las entradas en el registro de la base de datos, y me gustaría configurar log4net con bufferSize = 100 (o más), luego quiero que el administrador pueda hacer clic en la página de administración para obligar a log4net a escribir las entradas de registro almacenadas en la base de datos (sin cerrar log4net).

¿Es esto posible?

Respuesta

79

Suponiendo que está usando log4net fuera de la caja, se puede cavar su camino hacia abajo & lavar el appender así:

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

Editar: Escribí lo anterior bajo el supuesto de que Querías vaciar los appenders para un ILog específico (probablemente una mala suposición ahora que volví a leer la pregunta), pero como señala Stefan en un comentario a continuación, puedes simplificar un poco el código si quieres vaciar todos los appenders el repositorio completo de la siguiente manera:

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

Creo que log4net.LogManager.GetRepository(). GetAppenders(); obtendrá todos los appenders sin importar a qué registrador están conectados ... –

+0

@Stefan: Bien manchado. He actualizado mi respuesta. Gracias. – Alconja

+5

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

Cuestiones relacionadas