You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:24:59