29

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
  • 44,147
  • 19
  • 125
  • 140

2 Answers2

20

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
  • 55,421
  • 15
  • 173
  • 154
  • 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
  • 20,084
  • 10
  • 51
  • 72