30

If class T contains dependency on ILogger, dependency is resolved:

public class Foo
{
    private ILogger _logger;

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

but the following does not work, as logger will be null:

public class Foo
{
    private ILogger _logger;

    public Foo(ILogger logger)
    {
        _logger = logger;
    }
}
Set
  • 47,577
  • 22
  • 132
  • 150

2 Answers2

21

Logging adds the following services to DI

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

and Logger<> depends on ILoggerFactory from DI.

For your second scenario you would need to inject ILoggerFactory instead of ILogger.

public Foo(ILoggerFactory loggerFactory)
{
    _logger = loggerFactory.CreateLogger("logger name here");
}
Kiran
  • 56,921
  • 15
  • 176
  • 161
  • 1
    Don't inject ILoggerFactory. See the answer here: https://stackoverflow.com/questions/51345161/should-i-take-ilogger-iloggert-iloggerfactory-or-iloggerprovider-for-a-libra – Grinn Apr 05 '19 at 17:37
2

Your first scenerio works because ILogger<> inherits from ILogger(see source code)

public interface ILogger<out TCategoryName> : ILogger
{

}

But as @KiranChalla said, in the LoggingServiceCollectionExtensions ILogger<> is registered(not ILogger) so your second scenerio does not work.

adem caglin
  • 22,700
  • 10
  • 58
  • 78