使用ASP.NET Core健康检查与Serilog避免冗余日志事件
正确的中间件与健康检查配置顺序
核心配置步骤(Program.cs)
- 先配置Serilog宿主集成
var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() .WriteTo.Console(); });
- 构建应用后添加基础中间件
var app = builder.Build(); // 异常处理等基础中间件 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); }
- 添加Serilog请求日志中间件(关键:放在路由中间件之前)
app.UseSerilogRequestLogging(options => { // 过滤健康检查请求,避免生成无用日志 options.GetLevel = (httpContext, elapsed, ex) => { if (httpContext.Request.Path.StartsWithSegments("/health")) { return Serilog.Events.LogEventLevel.Verbose; // 低级别日志默认不输出 } return Serilog.Events.LogEventLevel.Information; }; });
- 添加路由与授权中间件
app.UseRouting(); app.UseAuthorization();
- 最后配置健康检查端点(使用MapHealthChecks)
app.MapHealthChecks("/health"); // 其他业务端点配置,如MapControllers()、MapRazorPages()等
为什么要这样排序?
UseSerilogRequestLogging放在UseRouting之前,能完整捕获请求的路由上下文信息,同时方便我们通过请求路径识别健康检查请求,直接过滤掉无用日志。MapHealthChecks作为端点配置,必须放在UseRouting和UseAuthorization之后,符合ASP.NET Core端点路由的规范,确保健康检查请求能被正确路由处理,避免出现未授权或路由匹配失败的错误日志。
额外优化:彻底排除健康检查日志
如果不想让健康检查请求的日志进入Serilog管道,还可以在Serilog配置中直接添加过滤规则:
builder.Host.UseSerilog((context, config) => { config.ReadFrom.Configuration(context.Configuration) .Enrich.FromLogContext() .Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health")) .WriteTo.Console(); });
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

