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