NET5 Kestrel在负载均衡服务器上频繁生成连接ID日志问题
问题原因
- 该现象由负载均衡的四层TCP健康检查触发:部署环境的负载均衡器为了确认后端服务存活,会高频向你的.NET 5 REST API节点发送TCP探测请求,这类探测仅完成TCP三次握手建立连接后就立即主动断开,不会发送实际的HTTP业务请求,因此Kestrel会记录完整的连接建立、客户端主动关闭、连接销毁的全流程调试日志,和你贴出的日志特征完全匹配。
- 本地运行和集群内部部署时没有负载均衡层的高频健康探测流量,因此不会出现该类日志。
解决方案
方案1:调整日志级别过滤无效调试日志(生产环境首选)
生产环境默认不需要开启Kestrel的Debug级日志,直接修改appsettings.Production.json的日志配置,将Kestrel相关日志级别调高到Information及以上即可过滤这类无效日志:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Server.Kestrel": "Information", "Microsoft.AspNetCore.Server.Kestrel.Sockets": "Information", "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
该方案无需调整负载均衡和业务代码,对服务运行无任何影响
方案2:配置七层健康检查替换四层TCP探测
在服务中新增专用健康检查接口,修改负载均衡探测规则使用七层HTTP探测,还可以配合长连接配置减少频繁连接创建销毁:
- 在服务启动类中注册健康检查服务(Startup.cs/Program.cs):
// .NET 5 写法 services.AddHealthChecks();
- 映射健康检查路由:
app.UseEndpoints(endpoints => { endpoints.MapHealthChecks("/health"); // 保留原有业务路由配置 });
- 修改负载均衡配置,将健康探测调整为GET请求
/health路径,同时开启长连接复用,匹配Kestrel的KeepAlive超时配置。
方案3:优化Kestrel连接配置适配负载均衡策略
如果需要保留Debug级日志,仅减少连接创建频率,可以调整Kestrel的长连接参数和负载均衡配置对齐:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { // 保持超时时间和负载均衡的长连接超时配置一致 options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2); // 根据实际业务量调整最大并发连接数 options.Limits.MaxConcurrentConnections = 1000; }); webBuilder.UseStartup<Startup>(); });
内容的提问来源于stack exchange,提问作者DanielC
相关产品推荐
相关产品推荐

