.NET6 Kestrel应用如何在运行时更新appsettings.json配置的日志级别?
问题解答
你遇到的核心问题是手动创建的IConfigurationRoot与WebHost内部的配置实例相互独立,导致配置刷新无法同步到日志系统。
问题分析
你的代码中手动构建了一个IConfigurationRoot并传给ConfigureLogging,但WebHost通过ConfigureAppConfiguration又重新构建了一份配置。这两个配置实例完全独立:虽然手动创建的实例开启了reloadOnChange=true,但WebHost的配置刷新不会同步到它,日志系统也就无法感知到配置变化。
解决方案
不要手动传递独立的配置实例,而是让日志系统使用WebHost上下文提供的配置(该配置会自动处理刷新逻辑)。修改后的代码如下:
IWebHostBuilder webHost = WebHost .CreateDefaultBuilder(args) // 使用带上下文的ConfigureLogging重载,获取WebHost内部的配置 .ConfigureLogging((context, loggingBuilder) => { // 绑定Logging节点的配置,该配置会自动刷新 loggingBuilder.AddConfiguration(context.Configuration.GetSection("Logging")); loggingBuilder.AddConsole(); }) .ConfigureAppConfiguration(config => { config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); config.AddEnvironmentVariables(); }) .UseStartup<TStartup>();
额外注意事项
- 确保
appsettings.json中的日志配置结构正确,示例如下:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" }, "Console": { "IncludeScopes": false } } }
- 修改配置文件并保存后,配置刷新默认会在5秒内生效,无需重启应用。
- 无需手动监听配置变化事件,WebHost的配置系统已内置该逻辑。
内容的提问来源于stack exchange,提问作者Ciprian
相关产品推荐
相关产品推荐

