如何在通过Host.CreateDefaultBuilder挂载的Web主机中配置日志记录

4

我正在将以下可行的WebHost.CreateDefaultBuilder方法改编为基于Host.CreateDefaultBuilder的方法,以便我可以使用UseWindowsService 扩展方法

// WORKING
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging((hostingContext, logging) =>
    {
      ...
    })
    .UseStartup<Startup>();
}

当我尝试适应这个时...

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureLogging((hostingContext, logging) =>
    { // tried here
      ...
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
      webBuilder.ConfigureLogging((hostingContext, logging) =>
        { // tried here too
          ...
        });
        .UseStartup<Startup>();
    });

我遇到了以下错误...

在尝试激活 'MyProject.Startup' 时,无法解析类型为 'Microsoft.Extensions.Logging.ILoggerFactory' 的服务。

这里应该如何设置日志记录?


@Nkosi...我认为这并不重要,因为WebHost.CreateWebHostBuilder版本可以正常工作...这是一个pastebin链接,因为我不想使问题过载。https://pastebin.com/CSWPkePh - Tracker1
过去,我曾经在ConfigureServices或Configure下遇到配置选项崩溃的情况,并且日志/控制台没有输出。目前看来它正在工作,但是如果无法在启动时记录日志,故障排除将非常困难。 - Tracker1
我相信 Configure 仍然允许工厂作为可注入参数之一。 - Nkosi
1个回答

3

参考ASP.NET Core中的应用程序启动

只有使用通用主机(IHostBuilder)时,以下服务类型才能被注入到Startup构造函数中:

  • IWebHostEnvironment
  • IHostEnvironment
  • IConfiguration

虽然你链接的Startup似乎在允许的服务之外进行了注入。

public Startup(ILoggerFactory loggerFactory)
{
  this._Factory = loggerFactory;
  this._Logger = loggerFactory.CreateLogger<Startup>();
}

基于链接的Startup代码,日志记录器似乎没有被使用,并且对日志记录器的唯一引用已经被注释掉了,因为基于它所使用的上下文,它是不需要的。
我建议在将代码重构到较新版本的框架时,从Startup构造函数中移除ILoggerFactory的注入。
除此之外,原始示例代码提供的所有内容都遵循文档中建议的格式,并且应该按预期工作。

谢谢...我在 GH Issues 中找到了这个参考。叹气很遗憾这个功能已经损坏了...我已经在启动时删除了记录器,并启用了 webBuilder.CaptureStartupErrors(true); 应该在文档中推荐这个设置,因为日志记录不再起作用,不确定在 ConfigureServices/Configure 中埋藏异常的先前行为是否仍然存在。https://github.com/aspnet/AspNetCore/issues/9337 - Tracker1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接