问题描述
我有一个ASP.NET Core 3.1应用程序,该应用程序是从ASP.NET Core 2.0升级的。我们希望获得旧的启动消息(“正在监听:http:// localhost:5000”等)以通过配置的结构化日志记录选项进行日志记录。这对于新的3.1项目来说是开箱即用的,但是我无法弄清楚如何在启动时不使用ConfigureWebHostDefaults()
方法的现有项目中启用它。例如,这通过结构化日志记录启动日志:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
但这不是:
public static void Main(string[] args)
{
new WebHostBuilder()
.UseKestrel()
.ConfigureLogging((hostingContext,logging) =>
{
logging.AddDebug();
logging.AddConsole();
})
.UseStartup<Startup>()
.Build()
.Run();
}
我发现了这个问题:
What is the difference between ConfigureWebHostDefaults and ConfigureWebHost methods?
并扫描了链接在那里的代码,但是我空白了。将Kestrel连接到日志记录基础架构的魔咒是什么?
解决方法
最后,我们只需要完全切换到新的主机生成器(CreateHostBuilder
到旧的CreateWebHostBuilder
)即可。我们之前曾尝试过,但是在ConfigureLogging
中添加自定义日志记录提供程序时,我们最终得到了重复的日志消息,因此在不完全了解其区别的情况下,我们回滚到了旧方法。丢失的位正在呼叫ClearProviders()
。以前,我们有:
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.ConfigureAppConfiguration((context,config) => { ... }))
.ConfigureLogging((hostingContext,logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddProvider(new CustomLoggerProvider());
logging.AddDebug();
})
.UseStartup<Startup>();
现在:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext,config) => { ... } ))
.ConfigureLogging((hostBuilder,logging) =>
{
logging.ClearProviders();
logging.AddConfiguration(hostBuilder.Configuration.GetSection("Logging"));
logging.AddProvider(new CustomLoggerProvider());
logging.AddDebug();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
现在,红est将其状态消息以及其他所有信息记录到首选记录器中。