如何在 ASP.NET MVC 6 中注册 ILogger 以进行注入

How to register ILogger for injection in ASP.NET MVC 6

我有一个 ASP.NET MVC 6 (beta-4) 应用程序。

public void ConfigureServices(IServiceCollection services)
{
    // Logging
    services.AddLogging();

    // ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
{
    // Add the console logger.
    loggerfactory.AddConsole(minLevel: LogLevel.Warning);

    // ...
}

我有一个控制器...

public class HomeController : 
    Controller
{
    ILogger _logger;

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

    // ...
}

但是当我无法以某种方式正确注册服务时:InvalidOperationException: Unable to resolve service for type 'Microsoft.Framework.Logging.ILogger' while attempting to activate 'HomeController'.。注册记录器我做错了什么?

我认为 services.AddLogging(); 做了正确的事情并注册了 ILogger。看了源码(https://github.com/aspnet/Logging/blob/d874c5726e713d3eb34938f85faf7be61aae0f2a/src/Microsoft.Framework.Logging/LoggingServiceCollectionExtensions.cs)发现其实是在注册ILogger<>。将 ILogger 的签名更改为 ILogger<HomeController> 可使上述示例生效。

public class HomeController : 
    Controller
{
    ILogger<HomeController> _logger;

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

    // ...
}

感谢@Steve 让我走上了正确的轨道来找到它。

services.AddLogging(); 对我不起作用,所以我将这两个语句添加到 ConfigureServices:

services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));

现在 DI 容器很开心,一切正常。

只需将此行添加到 ConfigureServices

services.AddSingleton(Serilog.Log.Logger);

.NET 5.0解决方案;它也适用于普通控制器和通用控制器:

public class EnhancedGeneric<T> : BaseApiController
{
    private readonly ILogger _logger;

    public EnhancedGeneric(ILoggerFactory logger)
    {
        _logger = logger.CreateLogger(typeof(T).Name);
    }

    public void OnGet()
    {
        _logger.LogInformation("GET pages called.");
    }
}