1. ホーム
  2. c#

[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない

2022-02-23 23:55:42

質問事項

コンソールアプリケーションの Main このように

var services = new ServiceCollection()
                .AddLogging(logging => logging.AddConsole())
                .BuildServiceProvider();

そして、それを別のクラスで使おうとすると、次のようになります。

    private readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }

System.InvalidOperationException: 'Unable to resolve service for type' (タイプのサービスを解決できません) 'Microsoft.Extensions.Logging.ILogger'です。

次の解決策を試してみました。 こちら が、私にはうまくいきませんでした。

編集 下記のYaakovさんのコメントと このGithubのコメント 次のようにして、正しく解決することができました。

    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }

私は、これを最初の BuildServiceProvider が、ロガー(または独自のILogger)を使いたいときは、毎回これを繰り返さなければならないようです。

解決方法は?

ILogger はデフォルトで登録されなくなったが ILogger<T> があります。それでもILoggerを使いたい場合は、以下のように手動で登録します(Startup.cs)。

    public void ConfigureServices(IServiceCollection services)
    {
        var serviceProvider = services.BuildServiceProvider();
        var logger = serviceProvider.GetService<ILogger<AnyClass>>();
        services.AddSingleton(typeof(ILogger), logger);
        ...
     }

ここで、AnyClassは、次のような一般的なものであってもよい。

     public class ApplicationLogs
     {
     }

だから

        public void ConfigureServices(IServiceCollection services)
        {
            var serviceProvider = services.BuildServiceProvider();
            var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
            services.AddSingleton(typeof(ILogger), logger);
            ...
         }

ILogger は、コンストラクタ注入によって解決するようになりました。