Как немедленно сделать журнал экземпляра Serilog в Seq, не вызывая его Dispose ()?

У меня есть служба Windows, которая обрабатывает длительные задачи и никогда не завершает работу, если это не сделано принудительно (например, выключение компьютера). Я хотел бы, чтобы один и тот же экземпляр Serilog работал все время, пока служба Windows работает (по соображениям производительности).

Однако я вижу журналы только после вызова Dispose (), как показано ниже.

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341")
            .CreateLogger();

logger.ForContext("TestContext", new { Machine = "TSTDB2" }, true).Information("Test");

logger.Dispose();

Я бы не возражал против задержки в несколько секунд, но ждать, пока экземпляр Serilog не будет удален, для меня не работает. Приветствуются любые решения.


person SamDevx    schedule 26.10.2017    source источник
comment
Завершается ли процесс в вашем тесте или вы пробовали его в длительном процессе? Есть ли шанс восстановить свой сценарий в минимальном Program.cs воспроизведении? Вы создаете более одного экземпляра регистратора или назначаете регистратор какому-либо статическому полю? (HTH, просто пытаюсь генерировать идеи.)   -  person Nicholas Blumhardt    schedule 27.10.2017


Ответы (2)



Я столкнулся с аналогичной проблемой при отладке. Я понял, что когда вы устанавливаете точку останова и отлаживаете, вызовы Seq не будут происходить, если вы не дадите несколько секунд времени обработки. Причина этого в том, что он сохраняет журналы в течение нескольких секунд перед массовой отправкой любых журналов, стоящих в очереди. Сколько и как часто можно настроить. По умолчанию я считаю, что это 2 секунды.

Еще вы можете попробовать использовать подход глобального контекста, который хорошо работает для консольных приложений.

Log.Logger = new LoggerConfiguration()
        .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
        .CreateLogger();

// Now you can make logging calls from anywhere in the application (main thread). 
Log.Debug("Test log");

Бывают также случаи, когда определенные исключения и выходы приложений препятствуют загрузке журналов. Убедитесь, что вы даете журналам время для загрузки до того, как ваши приложения (или потоки) завершатся по какой-либо причине.

person GrayDwarf    schedule 07.06.2018