log4net buffer flush adonetappender

¿Hay alguna forma de vaciar programáticamente el búfer en log4net?



buffer flush (2)

Hoy está disponible la opción más sencilla:

LogManager.Flush();

Vacía los eventos de registro almacenados en búfer en todos los agregadores configurados en el repositorio predeterminado. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

Es altamente recomendable agregar un timeout, como

LogManager.Flush(3000);

Estoy usando log4net con AdoNetAppender. Parece que el AdoNetAppender tiene un método de descarga. ¿Hay alguna forma de que pueda llamar a eso desde mi código?

Estoy intentando crear una página de administración 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 un botón en el administrador página para forzar a log4net a escribir las entradas del registro en búfer en la base de datos (sin cerrar log4net).

¿Es eso posible?


Suponiendo que esté utilizando log4net fuera de la caja, puede excavar y descargar al appender de esta forma:

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 : escribí lo anterior bajo el supuesto de que querías eliminar a los agregadores para un ILog específico (probablemente es un mal supuesto ahora que ILog la pregunta), pero como Stefan señala en un comentario a continuación, puedes simplificar el código. un poco si desea vaciar a todos los agregadores en todo el repositorio 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(); } } }