ASP.NET Core 3 启动控制器时记录错误

ASP.NET Core 3 Logging errors when starting Controller

我正在尝试在 ASP.NET Core 3 中获取 API 服务 运行 并进行日志记录,但在尝试从依赖项服务检索 ILogger 时,我一直收到错误消息。我想我已经遵循了我能找到的例子,但我不断得到:

"System.InvalidOperationException: 'Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger`1[GMT.Beacon.Service.Startup]' while attempting to activate 'GMT.Beacon.Service.Startup'.'"

我使用默认模板启动项目,因此它通过默认构建器设置 Web 主机,根据文档应该自动配置日志记录。此外,我尝试手动添加供应商,但我得到了同样的错误。我觉得我错过了一些明显的东西,但无法弄清楚是什么。

这是错误的 Program.cs class:

public class Program { 
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {
                webBuilder.UseStartup<Startup>();
            });

    public static void Main(string[] args) {
        var host = CreateHostBuilder(args).Build();
        var logger = host.Services.GetRequiredService<ILogger<Program>>();
        logger.LogInformation("Test log entry.");
        host.Run();
    }
}

在Startup.csclass中,这里是构造函数:

public Startup(IConfiguration config, IHostEnvironment hosting, ILogger<Startup> logger) {
    _hosting = hosting;
    _config = config;
    _logger = logger;

    _logger.LogInformation($"{DateTime.UtcNow:R} - Starting (Environment={_hosting.EnvironmentName}; " + $"InformationalVersion={Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion};");
}

根据我能找到的文档,这似乎应该有效,但它却在网上抛出上述错误:

var host = CreateHostBuilder(args).Build();

我也尝试手动配置日志记录(使用以下代码),但返回相同的错误。

Host.CreateDefaultBuilder(args)
    .ConfigureLogging((hostingContext, logging) => {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddEventSourceLogger();
        logging.AddConsole();
        logging.AddDebug();
    })
    .ConfigureWebHostDefaults(webBuilder => {
        webBuilder.UseStartup<Startup>();
    });

有没有人发现这个设置有问题,或者知道如何在 ASP.NET Core 3 中正确配置日志子系统?

这是 ASP.NET Core 3 中发生的变化。请参阅公告 here

TLDR: The only types the generic Host supports for Startup constructor injection are IHostEnvironment, IWebHostEnvironment, and IConfiguration. Applications using WebHost are unaffected.

ILogger<T> 可注入 Configure,因此您可以从那里访问它以记录您的启动消息:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)
{
    logger.LogInformation(...);

    // ...
}

在 ASP.NET 核心 2.x 中,日志记录是在主机构建器中创建的。这意味着默认情况下可以通过 DI 进行日志记录,并且可以将其注入 Startup class:

public class Startup
{
    private readonly ILogger<Startup> _logger;


    public Startup(ILogger<Startup> logger, IConfiguration configuration)
    {
        _logger = logger;
        Configuration = configuration;
    }

}