Quiero cerrar mi aplicación y escribir cualquier mensaje de registro pendiente. Entonces llamo al LogManager.Flush()
durante el proceso de cierre. Sin embargo, no veo todos los mensajes escritos. En cambio, si espero unos segundos (usando Thread.Sleep()
) veo los mensajes.¿Debería NLog purgar todos los mensajes en cola en AsyncTargetWrapper cuando se llame a Flush()?
Después de examinar NLog's code on GitHUB, encuentro que el método AsyncTargetWrapper.FlushAsync()
solo está programando el hilo del escritor diferido para escribir todos los mensajes pendientes en el siguiente lote. No está escribiendo mensajes de registro sincrónicamente.
¿Es este el comportamiento esperado? Estoy esperando que LogManager.Flush()
sea síncrono, es decir: para bloquear hasta que se escriban todos los mensajes pendientes (o se exceda el tiempo de espera).
Código utilizo en el apagado:
LogManager.Flush(ex => { }, TimeSpan.FromSeconds(15));
y luego el código para inicializar Nlog (esta es una aplicación de Silverlight, así que no estoy usando los archivos de configuración).
public static void InitialiseNLog(LogLevel forLevel)
{
var config = new LoggingConfiguration();
// Add targets.
// We need an async target wrapping a custom web service call back to the server.
var serverTarget = new RemoteServiceTarget();
var asyncWrapper = new AsyncTargetWrapper(serverTarget, 10000, AsyncTargetWrapperOverflowAction.Discard);
asyncWrapper.TimeToSleepBetweenBatches = (int)TimeSpan.FromSeconds(2).TotalMilliseconds;
asyncWrapper.BatchSize = 200;
// Add rules.
var rule = new LoggingRule("Company.Application.SilverlightApp.*", forLevel, asyncWrapper);
config.LoggingRules.Add(rule);
// Activate the configuration.
LogManager.Configuration = config;
LogManager.GlobalThreshold = forLevel;
}
Como resultado de la función FlushAsync convertirse sincronización ;-) Esta no es una solución. –
Esto es un poco viejo ahora, así que no puedo recordar todo el contexto. Pero llamar 'Thread.Sleep()' al apagar es difícilmente una mejor alternativa. Hay un método 'LogManager.Shutdown()' en NLog actual, que podría ser una mejor alternativa (aunque no lo he probado). – ligos