Как настроить Steeltoe Dynamic Logging на сторонние регистраторы под Serilog?

У меня есть приложение ASP.NET Core 2.1 в Pivotal Cloud Foundry, где мы хотим иметь возможность настраивать уровни ведения журнала на лету. В качестве поставщика логгеров мы используем Serilog. Возможно ли, что Steeltoe Dynamic Logging правильно работает со сторонними регистраторами и как?

Вот что я попробовал:

В Program.cs:

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseCloudFoundryHosting()
            .ConfigureLogging((builderContext, loggingBuilder) =>
             {
                 loggingBuilder.AddDynamicConsole();
             })
            .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                        .ReadFrom.Configuration(hostingContext.Configuration))
            .UseStartup<Startup>();

В appsettings.json

"Serilog": {
"WriteTo": [
  {
    "Name": "Console",
    "Args": {
      "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext}: {Properties} {NewLine} {EventId} {Message:lj}{NewLine}{Exception}"
    }
  }
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]

}

В appsettings.Development.json:

 "Logging": {
"LogLevel": {
  "Default": "Debug"
  }
}

И я получаю только это в Configure Logging Levels: Скриншот настройки уровней ведения журнала

Что я делаю неправильно?

1 ответ

Решение

Steeltoe.Extensions.Logging.DynamicLogger - это обертка вокруг Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider, Так как он существует сегодня, он предназначен для использования с системой регистрации Microsoft, где допускается несколько ILoggerProviders.

Serilog вставляет себя в конвейер журналирования и не разрешает другие ILoggerProviders, поэтому добавление его в приложение с Steeltoe Management и DynamicLogger нарушит способность Steeltoe изменять уровни журналов во время выполнения.

Эндрю Локк написал хороший пост с некоторыми подробностями о том, как Serilog подключается.

Я добавил поддержку Serilog для Steeltoe здесь: https://github.com/SteeltoeOSS/Logging/pull/4

Дайте мне знать, если это решит вашу проблему.

Я часами работаю над той же проблемой: зарегистрируйте Serilog, а также других поставщиков журналов (в моем случае - Nlog).

Помимо поведения по умолчанию Serilog (заменяющего всех других поставщиков журналов), Serilog предоставляет способ регистрации других поставщиков журналов через свой API.

Код для создания регистратора Serilog и регистрации NLog рядом с Serilog в качестве поставщика журналов через Serilog Api в моем случае выглядит следующим образом:

// Configure nlog.
NLogBuilder.ConfigureNLog("nlog.config");

// Create an ILoggerProvider instance (needed to pass it to Serilog Api).
var nlogLoggerProvider = new NLogLoggerProvider();

// Create LoggerProviderCollection because this data type has to be passed to Serilog Api-Call.
var loggerProviderCollection = new LoggerProviderCollection();
loggerProviderCollection.Add(nlogLoggerProvider);

// Create Serilog Logger and call WriteTo.Providers() in order to register other Log Providers.
var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .MinimumLevel.Debug()
    .Enrich.FromLogContext()

    // This way you can register other LogProviders beside Serilog.
    .WriteTo.Providers(loggerProviderCollection)

    .CreateLogger();

Что вам нужно для регистрации других поставщиков журналов при использовании Serilog, так это объект вашего поставщика журналов, который реализует интерфейс ILoggerProvider. Вы можете передать коллекцию объектов, реализующих ILoggerProvider, в ваш регистратор Serilog, и они должны работать (по крайней мере, когда я смешиваю NLog и Serilog).

Я полагаю, что вы можете попытаться использовать LoggerFactory вместо LoggingProvider, чтобы параллельно иметь более одного доступного провайдера журналирования, чтобы Steeltoe все еще мог обернуть ConsoleLoggerProvider, пока ваш Serilog продолжает работать, как и ожидалось...

Почему бы вам не попробовать быстрый POC, используя эту статью в качестве примера (вам нужно только добавить к ней материал из Steeltoe и платформы PCF и попробовать):

https://www.codeproject.com/Articles/1217036/Console-Logging-and-Reading-Excel-Files-with-NET-C

( Эта другая проблема с NLog связана с вашей проблемой в репозитории Steeltoe Github, и она дала мне идею, думаю, стоит попробовать)

Я надеюсь, что это помогает!

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