1. ホーム
  2. .net-core

ConsoleLoggerProviderでLoggerFactoryを作成する方法とは?

2023-09-06 13:49:10

質問

その ConsoleLoggerProvider には4つのコンストラクタがあります。

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

そのうち3つはこのメッセージとともに廃止が宣言されています。

このメソッドは時代遅れで、将来のバージョンで削除される予定です。推奨される代替案は、フィルタリングを設定するためにLoggerFactoryを使用し、ロギングオプションを設定するためにConsoleLoggerOptionsを使用することです。

コンストラクタ #3 で LoggerFactoryConsoleLoggerProvider は簡単です (ドキュメントにあるように Entity Framework コア - ロギング ):

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 });

これは複雑すぎるように思えますが、何かもっと単純なものを見逃していませんか?

どのように解決するのですか?

.NET Core 2.2において、.NET Core 2.0から.NET Core 2.0へのアップグレードのために 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();
    }
);

も参照してください。