当前位置: 首页 > 知识库问答 >
问题:

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

耿招
2023-03-14

我试图通过日志记录让API服务在ASP.NET Core3中运行,但是当我试图从依赖项服务中检索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 Core3中的日志子系统?

共有1个答案

严亮
2023-03-14

这在ASP.NET Core3中有所改变。请参见此处的公告:

TLDR:泛型主机支持启动构造函数注入的唯一类型是iHostEnvironmentiWebHostEnvironmenticonfiguration。使用WebHost的应用程序不受影响。

Ilogger 可注入到configure中,因此您可以从那里访问它以记录启动消息:

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

    // ...
}
 类似资料:
  • 我刚刚为我们的微服务环境在前端创建了简单的Zuul代理,但现在我想将所有条目记录到通过代理的日志文件中。 做任何我需要做的事情。

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 当我尝试运行这段代码时,我在Level Object中面临一些问题。 错误:

  • 我正在迁移一个遗留的应用程序来使用logback,在这个过程中我试图保持所有的旧功能以相同的方式工作。遗留应用程序所做的一件事是,如果无法写入日志文件(由于空间不足、权限不正确等原因),则将日志记录到控制台 对于logback,似乎应该由StatusListener来处理这个问题,我可以使用getOrigin获得筛选后的附加程序,但我不知道如何获得与origin附加程序相关联的日志记录程序。有可能

  • 问题内容: 当运行Spring / Hibernate应用程序时,我在控制台上看到以下不需要的输出: 我已经像这样配置了Log4j记录器: 如何使这些消息静音? 问题答案: 我相当确定您正在看到这些SQL语句,因为Hibernate配置中某处的属性“ hibernate.show_sql”设置为true。找到该设置并将其更改为false。

  • Elasticsearch 作为一个服务,本身也会记录很多日志信息。默认情况下,日志都放在 $ES_HOME/logs/ 目录里。 日志配置在 Elasticsearch 5.0 中改成了使用 log4j2.properties 文件配置,包括日志滚动的方式、命名等,都和标准的 log4j2 一样。唯一的特点是:Elasticsearch 导出了一个变量叫 ${sys:es.logs},指向你在