Serilog - не удается закрыть и повторно открыть сопоставленные приемники в многопоточном приложении

Я оцениваю замену существующего регистратора в существующем тестовом приложении. Один из моих потенциальных кандидатов - Serilog. Приложение может запускать до 16 потоков, и каждый поток передается в имени используемого файла журнала. Потоки во время тестового приложения запускаются с 3 разными именами журналов. Я использую расширения Microsoft, чтобы заменить Serilog другим регистратором для оценки.

Мне нужно закрыть, удалить и перезапустить отдельные файлы журнала. Проблема, с которой я сталкиваюсь, заключается в том, что после вызова метода CloseAndFlush все журналы закрываются. Есть ли способ индивидуально закрыть файл журнала в потоке?

Моя конфигурация ниже. RunInLogger - это свойство ILogger, которое я передаю каждому потоку. Если я использую Microsoft Extensions, это Microsoft ILogger, или если я использую Serilog ILogger, это serilog ILogger.

var serilogLogger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Map("Name", "Other", (name, wt) => wt.File($"{name}", outputTemplate: outTML))
    .CreateLogger();

Log.Logger = serilogLogger;

ILoggerFactory loggerFactory = new LoggerFactory()
    .AddSerilog(serilogLogger);
       
RunInLogger = loggerFactory.CreateLogger("Program");

Каждому потоку передается RunInLogger (ILogger) и имя файла (RunInLogFile) для начала ведения журнала с помощью метода BeginScope.

using (RunInLogger.BeginScope(new Dictionary<String, object> { { "Name", RunInLogFile } }))
{
   RunInLogger.LogInformation(logEntry);
}

Я экспериментировал с использованием Serilog ILogger напрямую, думая, что могу добавить его в свой файл конфигурации - .Enrich.FromLogContext() и заменить BeginScope эквивалентом Serilog - LogContext.PushProperty("Name", RunInLogFile). Получившийся код я попытался закрыть только текущий журнал, но все же закрыл все журналы.

using (LogContext.PushProperty("Name", RunInLogFile))
{
   RunInLogger.Log.Information(logEntry);
   Log.CloseAndFlush()
}

Есть ли способ вызвать в LogContext только закрыть журнал, связанный с моим RunInLogFile?

0 ответов

Другие вопросы по тегам