尝试激活“Serilog.AspNetCore.RequestLoggingMiddleware”时无法解析“Serilog.Extensions.Hosting.DiagnosticContext”的服务

Any*_*are 4 c# middleware serilog asp.net-core .net-5

当我想使用 CustomSerilogRequestLogging作为中间件时,出现以下异常:

System.InvalidOperationException:尝试激活“Serilog.AspNetCore.RequestLoggingMiddleware”时无法解析类型“Serilog.Extensions.Hosting.DiagnosticContext”的服务。

我在外部库中的自定义 SerilogRequestLogging:

   public static IApplicationBuilder UseCustomSerilogRequestLogging(this IApplicationBuilder app)
        {
                return app.UseSerilogRequestLogging(options =>
                   {
                       options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
                       {

                           diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
                           diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
                           diagnosticContext.Set("RequestMethod", httpContext.Request.Method);
                           diagnosticContext.Set("RequestProtocol", httpContext.Request.Protocol);
                           diagnosticContext.Set("RequestPath", httpContext.Request.Path);
                           diagnosticContext.Set("RequestRemoteAddress", httpContext.Connection.RemoteIpAddress);

                       };
                   });
        }
Run Code Online (Sandbox Code Playgroud)

然后我将它作为中间件添加到配置方法中,如下所示:

 app.UseCustomSerilogRequestLogging();
Run Code Online (Sandbox Code Playgroud)

在程序.cs中:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseSerilog((provider, context, loggerConfig) =>
                {
                    loggerConfig.Configure(provider, Configuration);
                });
                webBuilder.UseStartup<Startup>();
            });
Run Code Online (Sandbox Code Playgroud)

外部库的扩展方法:

public static void Configure(this LoggerConfiguration loggerConfig,
        IServiceProvider provider, IConfiguration config)
        {
            var sqlserverConnectionString = config["ConnectionStrings:S1"];
            var sqlserverLogTable = config["Logging:S2"];
            var rollingFileName = config["Logging:S3"];

            //SQL CONFIGURATION HERE TO REDUCE THE NUMBER OF LINES...

            loggerConfig
            .ReadFrom.Configuration(config)
            .Enrich.FromLogContext()
            .Enrich.WithMachineName()
            .Enrich.WithAssemblyName()
            .Enrich.WithAssemblyVersion()
            .WriteTo.File(rollingFileName, restrictedToMinimumLevel: LogEventLevel.Verbose)
            .WriteTo.Seq(seqAddress)
           .WriteTo.MSSqlServer(
                connectionString: sqlserverConnectionString,
                sinkOptions: sinkOpts,
                columnOptions: columnOpts
            );
        }
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 7

正如评论中提到的,您当前显示的示例并未显示您.UseSerilog()与主主机构建器一起使用。虽然您可能已添加到 Web 默认构建器,但根据异常,它并未添加到服务集合中,而服务集合是最终构建主机时解决依赖关系的方法。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() //<-- THIS WAS MISSING HERE
        .ConfigureWebHostDefaults(webBuilder => {
            webBuilder.UseSerilog((provider, context, loggerConfig) => {
                loggerConfig.Configure(provider, Configuration);
            });
            webBuilder.UseStartup<Startup>();
        });
Run Code Online (Sandbox Code Playgroud)

其他一切都保持不变。

参考Serilog.Extensions.Hosting