CreateSlimBuilder и ILogger
От: IB Австрия http://rsdn.ru
Дата: 05.06.24 14:16
Оценка:
А кто-нибудь копался с разницей CreateBuilder vs CreateSlimBuilder?
Наткнулся на неожиданный сайд-эффект. CreateSlimBuilder не умеет подбирать форматтер логгера из конфига (application.json), то есть строчка "FormatterName": "json" игнорируется, при этом все остальное читается корректно.
На первый взгляд, разница между SlimBuilder и обычным, только в том, что первый подключает только SimpleConsole, а второй Console, Debug, EventSource и EventLog провайдеров.
Однако, следующий код к желаемому эффекту не приводит, например, json форматтер по прежнему из конфига не подхватывается.
            loggingBuilder.ClearProviders();
            loggingBuilder.AddConsole();
            loggingBuilder.AddDebug();

При этом, если заглянуть в код Logger.Console, то там тоже только simple провайдер, а json-а нет. То есть, обычный билдер явно делает какую-то магию, чтобы нужный форматтер подгрузить из конфига, но я этой магии в упор не вижу. Кто-нибудь знает, как он это делает?
Мы уже победили, просто это еще не так заметно...
Re: CreateSlimBuilder и ILogger
От: r0nd  
Дата: 05.06.24 22:06
Оценка: 42 (1)
On Jun 5, 2024, 5:16 PM, IB <343@users.rsdn.org> wrote:

IB>А кто-нибудь копался с разницей CreateBuilder vs CreateSlimBuilder?



Разница между CreateBuilder и CreateSlimBuilder заключается в количестве подключаемых провайдеров по умолчанию. CreateBuilder подключает Console, Debug, EventSource, и EventLog провайдеры, а CreateSlimBuilder только SimpleConsole.

IB>Наткнулся на неожиданный сайд-эффект.


Все верно. CreateSlimBuilder действительно не подхватывает форматтеры из конфига, потому что он использует только SimpleConsole, который не поддерживает форматтеры. Когда вы используете CreateBuilder, он подключает полный Console провайдер, который умеет подгружать форматтеры из конфигурации.

IB>
IB>            loggingBuilder.ClearProviders();
IB>            loggingBuilder.AddConsole();
IB>            loggingBuilder.AddDebug(); 
IB>


Этот код не сработает, потому что AddConsole добавляет только SimpleConsole провайдер, а не полноценный Console провайдер, который поддерживает форматтеры.

Нужно что-то такое:

loggingBuilder.ClearProviders();
loggingBuilder.AddConsole(options =>
{
    options.FormatterName = «json»;
});


Ну и не забыть добавить пакет Microsoft.Extensions.Logging.Console в проект, так как SimpleConsole идет из другого пакета (Microsoft.Extensions.Logging).

❧ “Somewhere, something incredible is waiting to be known.” —Carl Sagan
Re[2]: CreateSlimBuilder и ILogger
От: IB Австрия http://rsdn.ru
Дата: 07.06.24 11:47
Оценка:
Здравствуйте, r0nd, Вы писали:


R>Этот код не сработает, потому что AddConsole добавляет только SimpleConsole провайдер, а не полноценный Console провайдер, который поддерживает форматтеры.


да твоюж мать! То есть, и AddConsole и AddSimpleConsole добавляют SimpleConsole провайдер, а полноценный Console со всеми форматтерами нужно как-то по другому?

У меня цель простая, локально хочу чтобы SimpleConsole работал, а в бою json, и менять это только в конфиге, а не обкладываться if-ами в коде.
Мы уже победили, просто это еще не так заметно...
Re[3]: CreateSlimBuilder и ILogger
От: r0nd  
Дата: 07.06.24 12:13
Оценка:
On Jun 7, 2024, 2:47 PM, IB <343@users.rsdn.org> wrote:

IB>да твоюж мать! То есть, и AddConsole и AddSimpleConsole добавляют SimpleConsole провайдер, а полноценный Console со всеми форматтерами нужно как-то по другому?


Ну да:

IB>У меня цель простая, локально хочу чтобы SimpleConsole работал, а в бою json, и менять это только в конфиге, а не обкладываться if-ами в коде.


Попробуйте сделать разные профили для локального конфига (appsettings.Development.json) и нет(appsettings.json).

❧ “I never dreamed about success. I worked for it.” — Estée Lauder
Re[4]: CreateSlimBuilder и ILogger
От: IB Австрия http://rsdn.ru
Дата: 07.06.24 12:47
Оценка:
Здравствуйте, r0nd, Вы писали:


R>Ну да:

R> Не, тут вообще какая-то мистика.
Пишу явно
            loggingBuilder.ClearProviders();
            ConsoleLoggerExtensions.AddConsole(loggingBuilder);


Ставлю дебаггер вот на этом коде фреймворка, вижу как добавляется
    public static ILoggingBuilder AddConsole(this ILoggingBuilder builder)
    {
      builder.AddConfiguration();
      builder.AddConsoleFormatter<JsonConsoleFormatter, JsonConsoleFormatterOptions, ConsoleFormatterConfigureOptions>();  /// <==
      builder.AddConsoleFormatter<SystemdConsoleFormatter, ConsoleFormatterOptions, ConsoleFormatterConfigureOptions>();
      builder.AddConsoleFormatter<SimpleConsoleFormatter, SimpleConsoleFormatterOptions, ConsoleFormatterConfigureOptions>();
      builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, ConsoleLoggerProvider>());
      builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<ConsoleLoggerOptions>, ConsoleLoggerConfigureOptions>());
      builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IOptionsChangeTokenSource<ConsoleLoggerOptions>, LoggerProviderOptionsChangeTokenSource<ConsoleLoggerOptions, ConsoleLoggerProvider>>());
      return builder;
    }


Лезу в отладчик, вижу там зарегистрированный JsonFormatter в IServiceProvider
В конфиге стоит "FormatterName":"json"
В консоль все равно льется Simple
Я явно где-то упускаю какую-то очевидную фигню.


R>Попробуйте сделать разные профили для локального конфига (appsettings.Development.json) и нет(appsettings.json).

В смысле, разные профили? У меня так и есть — в development стоит simple, в app — json, но эта строчка просто игнорируется и подхватывается последний провайдер. При этом если сделать AddConsole, то это всегда Simple. Собственно, в этом и проблема.
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.