Должен ли NLog сбрасывать все сообщения в очереди в AsyncTargetWrapper при вызове Flush ()?

Я хочу закрыть свое приложение и записать все ожидающие сообщения журнала. Поэтому я звоню 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;
    }

13
задан ligos 8 May 2012 в 04:52
поделиться