使用自定义SerilogRequestLogging中间件无法解析DiagnosticContext服务报错
错误原因
该异常是因为Serilog的DiagnosticContext服务未被注册到ASP.NET Core依赖注入容器中,Serilog.AspNetCore.RequestLoggingMiddleware运行时需要依赖该服务,无法解析时就会抛出对应报错。
前置检查
确保项目和自定义扩展所在的外部类库都已安装最新稳定版的Serilog.AspNetCore Nuget包,排除依赖缺失问题。
解决方案
按照如下步骤操作即可修复:
1. 调整Program.cs中UseSerilog的配置
在现有UseSerilog调用中增加addDiagnosticContext: true参数,开启DiagnosticContext的自动注册逻辑,修改后代码如下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseSerilog((provider, context, loggerConfig) => { loggerConfig.Configure(provider, Configuration); }, preserveStaticLogger: false, writeToProviders: true, addDiagnosticContext: true); webBuilder.UseStartup<Startup>(); });
2. 兼容低版本Serilog.AspNetCore的备选方案
如果你使用的Serilog.AspNetCore版本较低,不支持addDiagnosticContext参数,可以手动在Startup.cs的ConfigureServices方法中注册该服务:
using Serilog.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection.Extensions; public void ConfigureServices(IServiceCollection services) { // 其他服务注册逻辑... services.TryAddSingleton<IDiagnosticContext, DiagnosticContext>(); }
3. 确认中间件注册顺序
UseCustomSerilogRequestLogging必须放在UseRouting之后、认证授权类中间件(如UseAuthorization/UseAuthentication)之前,才能正确获取到请求上下文信息,示例配置如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 异常处理、静态文件、HTTPS跳转等中间件... app.UseRouting(); // 请求日志中间件放在此处 app.UseCustomSerilogRequestLogging(); app.UseAuthentication(); app.UseAuthorization(); // 端点路由中间件... app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
内容的提问来源于stack exchange,提问作者Anyname Donotcare
相关产品推荐
相关产品推荐

