Как создать LoggerFactory с ConsoleLoggerProvider?

ConsoleLoggerProvider имеет четыре конструктора:

  1. ConsoleLoggerProvider(IConsoleLoggerSettings)
  2. ConsoleLoggerProvider(IOptionsMonitor<ConsoleLoggerOptions>)
  3. ConsoleLoggerProvider(Func<String,LogLevel,Boolean>, Boolean)
  4. ConsoleLoggerProvider(Func<String,LogLevel,Boolean>, Boolean, Boolean)

Этим сообщением три из них объявлены устаревшими:

Этот метод устарел и будет удален в будущей версии. Рекомендуемой альтернативой является использование LoggerFactory для настройки фильтрации и ConsoleLoggerOptions для настройки параметров ведения журнала.

С конструктором № 3 создать LoggerFactory с ConsoleLoggerProvider очень просто (как описано в Entity Framework Core - ведение журнала):

var loggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((category, level) => level >= LogLevel.Information, true) });

Но поскольку он устарел, у нас остался конструктор №2. Вот что я нашел эквивалентным:

var configureNamedOptions = new ConfigureNamedOptions<ConsoleLoggerOptions>("", null);
var optionsFactory = new OptionsFactory<ConsoleLoggerOptions>(new []{ configureNamedOptions }, Enumerable.Empty<IPostConfigureOptions<ConsoleLoggerOptions>>());
var optionsMonitor = new OptionsMonitor<ConsoleLoggerOptions>(optionsFactory, Enumerable.Empty<IOptionsChangeTokenSource<ConsoleLoggerOptions>>(), new OptionsCache<ConsoleLoggerOptions>());
var loggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider(optionsMonitor) }, new LoggerFilterOptions { MinLevel = LogLevel.Information });

Это кажется слишком сложным, я упустил что-то попроще?


person 0xced    schedule 09.12.2018    source источник
comment
С .NET5 стало хуже, а не лучше ...   -  person boatcoder    schedule 11.06.2021


Ответы (3)


В .NET Core 2.2 вы можете создать ILoggerFactory без использования устаревших методов через платформу внедрения зависимостей Microsoft. Он немного менее подробен, чем версия, где все создается вручную. Вот как:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder
    .AddConsole()
    .AddFilter(level => level >= LogLevel.Information)
);
var loggerFactory = serviceCollection.BuildServiceProvider().GetService<ILoggerFactory>();

А в .NET Core 3.0 вы можете использовать LoggerFactory .Create:

var loggerFactory = LoggerFactory.Create(builder => {
        builder.AddFilter("Microsoft", LogLevel.Warning)
               .AddFilter("System", LogLevel.Warning)
               .AddFilter("SampleApp.Program", LogLevel.Debug)
               .AddConsole();
    }
);
person 0xced    schedule 09.12.2018
comment
Это отлично подходит для композиции приложений, но что насчет того, когда я пишу тест или работаю с REPL? Было бы неплохо иметь возможность выполнять ILogger зависимости более простым способом. LoggerFactory почти достаточно короток, но обнаруживаемость не идеальна ... - person Lukáš Lánský; 25.03.2019
comment
К вашему сведению, первый пример .AddConsole () требует ссылки на Microsoft.Extensions.Logging.Console - person blackboxlogic; 27.08.2019
comment
что-то идет совсем не так @microsoft, когда для такой простой задачи нам нужна инъекция зависимостей и целая куча опций, провайдеров и фабрик - person python_kaa; 12.09.2019
comment
К вашему сведению, использование .AddConsole () также требует, чтобы вы импортировали пакет nuget Microsoft.Extensions.Logging.Console. - person Thomas N; 19.05.2020
comment
это абсолютное безумие - person tomasz_kajetan_stanczak; 07.02.2021

На всякий случай, если кто-то захочет сделать это в корне композиции ASP.NET Core для efcore:

services.AddDbContext<DbContext>(opt => {
    opt.AddSqlServer(Configuration.GetConnectionString("DefaultConnection"));
    opt.UseLoggerFactory(LoggerFactory.Create(builder => { builder.AddConsole(); }));
});
person Daniel B    schedule 22.12.2020

@ 0xced спасибо за ваш разобранный пример, поскольку делегаты не работают в Powershell, это помогло мне сделать то же самое в Powershell:

$optionsFactory = [OptionsFactory[ConsoleLoggerOptions]]::new(
    [List[ConfigureNamedOptions[ConsoleLoggerOptions]]]@(
        [ConfigureNamedOptions[ConsoleLoggerOptions]]::new('',$null)
    ),
    [List[IPostConfigureOptions[ConsoleLoggerOptions]]]::new()
)

$optionsMonitor = [OptionsMonitor[ConsoleLoggerOptions]]::new(
    $optionsFactory,
    [List[IOptionsChangeTokenSource[ConsoleLoggerOptions]]]::new(),
    [OptionsCache[ConsoleLoggerOptions]]::new()
)

$consoleLoggerProvider = [ConsoleLoggerProvider]$OptionsMonitor
$consoleLoggerProviderList = [List[ILoggerProvider]]::new()
$consoleLoggerProviderList.add($consoleLoggerProvider)

$loggerFactory = [LoggerFactory]::new(
    $consoleLoggerProviderList,
    [LoggerFilterOptions]@{
        MinLevel = [LogLevel]::Information
    }
)
person Justin Grote    schedule 08.03.2020