我想在 webhost 之前开始记录,所以记录了启动错误。所以我关注了Serilog's recommended init order : 1) 配置,2) 日志记录,3) 虚拟主机。我没有使用 CreateDefaultBuilder()。
所以我的 Program.cs 有:
// setup config
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true)
.AddJsonFile($"appsettings.{envName}.json", optional:true, reloadOnChange:true)
.AddEnvironmentVariables()
.AddCommandLine(args)
.Build();
// setup Serilog logging
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration) // <<< uses config from above
.CreateLogger()
// setup webhost
new WebHostBuilder()
.UseConfiguration(configuration) // <<< uses config from above
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseSerilog()
.Build()
.Run();
这有效,但即使我指定了 reloadOnChange:true,也未检测到 appsettings.json 中的更改。
但是,当我使用 ConfigureAppConfiguration() 时,会检测到更改:
new WebHostBuilder()
.ConfigureAppConfiguration((context, config) => {
// .. duplicate config here
})
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseSerilog()
.Build()
.Run();
但这意味着重复和可能无法预料的问题 - 即这是一个 hack。我该如何解决这个问题?
更新
根据@StephenZeng 的回答,UseConfiguration 在这里帮不了我,所以我想我需要使用 ConfigureAppConfiguration。但问题仍然存在 - 我如何先初始化我的配置,然后多次使用它而不重新定义它?
请您参考如下方法:
根据文档,它是设计使然:
“UseConfiguration 仅将提供的 IConfiguration 中的 key 复制到主机构建器配置。因此,为 JSON、INI 和 XML 设置文件设置 reloadOnChange: true 无效。”
