Serilog Logger每次端点调用冻结,抛出已冻结异常求助
解决Serilog "The logger is already frozen" 异常方案
核心原因
这个异常本质是Serilog的LoggerConfiguration在日志系统初始化完成后被重复修改导致的——比如请求处理流程中意外触发了Logger的重新构建,或是初始化逻辑存在重复执行的情况。
具体修复步骤
1. 校准Serilog初始化顺序
确保Serilog只在应用启动初期初始化一次,且在WebHost构建前完成:
// 先初始化Serilog实例 Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .CreateLogger(); try { var builder = WebApplication.CreateBuilder(args); // 替换ASP.NET Core默认日志系统为Serilog builder.Host.UseSerilog(); // 后续服务配置、中间件注册... var app = builder.Build(); // ... app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly"); } finally { Log.CloseAndFlush(); }
绝对避免在builder.Build()之后或请求处理过程中调用LoggerConfiguration的相关方法。
2. 排查动态修改日志配置的代码
全局搜索项目中所有使用Log.Logger或LoggerConfiguration的位置,重点检查:
- 自定义中间件是否存在重新配置日志的逻辑
- 服务类里是否有动态调整日志级别、添加Sink的代码
- 第三方依赖是否意外修改了Serilog的内部状态
如果发现这类代码,直接移除或调整到应用启动阶段执行。
3. 统一Serilog相关包版本
确保所有Serilog系列NuGet包版本一致,尤其是:
Serilog.AspNetCoreSerilog.Settings.Configuration- 各类
Serilog.Sinks.*输出端包
版本不匹配易引发内部状态冲突,建议更新到最新稳定版并保持版本统一。
4. 手动配置请求日志避免冲突
如果是自动请求日志引发的问题,手动配置UseSerilogRequestLogging并检查是否重复添加:
// 在Program.cs中间件注册阶段添加 app.UseSerilogRequestLogging(options => { // 自定义配置示例:调整日志级别、过滤特定路径 options.GetLevel = (ctx, elapsed, ex) => LogEventLevel.Information; options.IgnorePath(path => path.StartsWith("/health")); });
5. 清理项目环境缓存
- 删除项目的
bin、obj目录后重新编译 - 清除NuGet缓存并重新安装所有依赖
- 检查
appsettings.json是否存在重复的Serilog配置节点
问题定位辅助
如果以上步骤无效,开启Serilog内部日志追踪问题来源:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .WriteTo.SerilogInternalLogger() // 启用内部日志输出 .CreateLogger();
内部日志会输出Serilog初始化、运行的细节,帮助定位重复修改Logger的代码位置。
内容的提问来源于stack exchange,提问作者JakobWl
相关产品推荐
相关产品推荐

