Как настроить 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, и она дала мне идею, думаю, стоит попробовать)
Я надеюсь, что это помогает!