.NET 6 Web API配置Serilog时抛出集合修改异常求助
问题原因与修复方案
问题根源
你在ConfigureServices的AddLogging委托内部调用webBuilder.UseSerilog(logger),这会在服务配置过程中修改主机的配置集合,触发“集合已修改”异常。UseSerilog属于主机级别的配置操作,不应嵌套在服务配置的子流程中执行。
修复后的代码
using Serilog; using Serilog.Core; using Serilog.Events; var ihb = Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { // 直接在ConfigureWebHostDefaults顶层配置Serilog,而非嵌套在ConfigureServices内 var logger = new LoggerConfiguration() .MinimumLevel.ControlledBy(new LoggingLevelSwitch(LogEventLevel.Error)) // 其他配置项 .CreateLogger(); webBuilder.UseSerilog(logger); webBuilder.ConfigureServices((context, collection) => { // 这里只做服务注册,不要再操作Serilog配置 collection.AddControllers(); // 其他服务配置 }); }); try { var ih = ihb.Build(); ih.Run(); } catch (Exception ex) { // 建议在这里添加异常日志,方便排查问题 Log.Fatal(ex, "应用启动失败"); }
额外优化建议
- 不要静默捕获启动异常,在
catch块中添加日志输出,便于排查启动阶段的问题。 - 更推荐使用
UseSerilog的委托重载,它能自动处理日志的生命周期管理,还可结合配置文件读取规则:
webBuilder.UseSerilog((context, config) => { config.MinimumLevel.ControlledBy(new LoggingLevelSwitch(LogEventLevel.Error)) // 从配置文件读取Serilog配置 .ReadFrom.Configuration(context.Configuration); });
内容的提问来源于stack exchange,提问作者user14267126
相关产品推荐
相关产品推荐

