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

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.AspNetCore
  • Serilog.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:20:21