Я хочу закрыть приложение и написать любые ожидающие сообщения журнала. Поэтому я вызываю LogManager.Flush()
во время моего завершения работы. Однако я не вижу всех выписанных сообщений. Вместо этого, если я жду несколько секунд (используя Thread.Sleep()
), я вижу сообщения.
После изучения кода NLog в GitHUB, я нахожу, что метод AsyncTargetWrapper.FlushAsync()
предназначен только для планирования ленивого потока писем для записи всех ожидающих сообщений на следующая партия. Он не пишет сообщения журнала синхронно.
Является ли это ожидаемым поведением? Я ожидаю, что LogManager.Flush()
будет синхронным, т.е. Заблокировать, пока не будут записаны все ожидающие сообщения (или превышение тайм-аута).
Код, который я использую при выключении:
LogManager.Flush(ex => { }, TimeSpan.FromSeconds(15));
И затем код для инициализации Nlog (это приложение Silverlight, поэтому я не использую никаких файлов конфигурации).
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;
}