Как включить область DependencyInjection в Microsoft.Extensions.Logging с многопоточностью? - PullRequest
0 голосов
/ 06 мая 2019

Я делаю Task.Run() и внутри него создаю область для внедрения зависимостей (using (var scope = serviceProvider.CreateScope())).Я хотел бы сообщить фабрике logger и регистраторам об этой области, а затем добавить ее к журналам.

Посмотрев на источник, я увидел, что фабрика logger и logger <> одноэлементны, что затрудняет их использование втак, как я пытаюсь.Если я изменю это в одном потоке, это изменится для всех других потоков ...

1 Ответ

0 голосов
/ 06 мая 2019

Я использую SeriLog, и с помощью обогащения можно достичь того, чего я хотел.При настройке Serilog вам необходимо убедиться, что вы настроили обогащение для LogContext:

return webHost
    .UseStartup<Startup>()
    .UseSerilog((context, config) =>
    {
        config
        .ReadFrom.Configuration(context.Configuration)
        .Enrich.FromLogContext();
    });

, а затем добавили необходимую информацию об области непосредственно перед или после создания своей области DI:

var task = Task.Run(() =>
{
    using (Serilog.Context.LogContext.PushProperty("ExecutionScope", "MyMultithreadedScope "))
    using (var scope = app.ApplicationServices.CreateScope())
    {
        Logger.LogDebug("test");
        //....
    }
});

Вы также должны указать свою собственность в Serilog outputTemplate.Пример: "{Timestamp:HH:mm:ss.fff} {ExecutionScope}{Message}"

LogContext использует AsyncLocal для хранения информации в контексте и поддерживает изменения потока управления, такие как асинхронность и многопоточность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...