为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
Smart猫小萌 2023-07-09 17:08:06
我正在尝试让 API 服务在 ASP.NET Core 3 中运行并进行日志记录,但在尝试从依赖项服务检索 ILogger 时不断收到错误。我想我已经遵循了我能找到的例子,但我不断得到:“System.InvalidOperationException:‘尝试激活‘GMT.Beacon.Service.Startup’时,无法解析类型‘Microsoft.Extensions.Logging.ILogger`1[GMT.Beacon.Service.Startup]’的服务。”我使用默认模板来启动项目,因此它通过默认构建器设置 Web 主机,根据文档应该自动配置日志记录。此外,我尝试手动添加提供程序,但遇到相同的错误。我觉得我错过了一些明显的东西,但无法弄清楚是什么。这是出现错误的 Program.cs 类: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.cs 类中,构造函数如下: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 中正确配置日志记录子系统?
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

这是 ASP.NET Core 3 中发生的变化

TLDR:通用 Host 支持启动构造函数注入的唯一类型是IHostEnvironment、IWebHostEnvironment和IConfiguration。使用 WebHost 的应用程序不受影响。


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


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger<Startup> logger)

{

    logger.LogInformation(...);


    // ...

}


查看完整回答
反对 回复 2023-07-09
?
POPMUISE

TA贡献1765条经验 获得超5个赞

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


public class Startup

{

    private readonly ILogger<Startup> _logger;



    public Startup(ILogger<Startup> logger, IConfiguration configuration)

    {

        _logger = logger;

        Configuration = configuration;

    }


}


查看完整回答
反对 回复 2023-07-09
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信