The MS docs article "Introduction to Logging in ASP.NET Core" gives 2 examples of constructor injection
using ILogger
private readonly ILogger _logger; public TodoController(ILogger<TodoController> logger) { _logger = logger; }
and ILoggerFactory
private readonly ILogger _logger; public TodoController( ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<TodoController>(); }
My question is what should I pass to child classes called from my controller
pass ILoggerFactory to my child classes called from the controller and in each class call
LoggerFactoryExtensions.CreateLogger<MyChildClass>()
orpass parent controller's
ILogger<MyController>
to each child class created from the controller and having non-generic parameter ILogger.
In logs I prefer to see separate category 'MyChildClass' for each class, rather than all classes use the category 'MyController' from the parent controller.
However CreateLogger in each object construction can be an expensive operation (e.g. see https://github.com/aspnet/Logging/issues/524)
Which option will you recommend? Can you suggest any other approach?
ILogger<T>
andILoggerFactory
are bad approaches. Injecting aILoggerFactory
causes your constructors to do too much, whileILogger<T>
just adds more noise to your code. Instead, you should inject a non-genericILogger
instead and let the DI infrastructure automatically inject the right logger for you. The reason however that the MS docs don't show this, is because the built-in container is too limited. It can't inject anILogger
for you that way. – StevenMicrosoft.Extendions.DependencyInjection
- say Serilog - and then need to plug - say - autofac in (easy), and register Serilog again in autofac? – lev haikin