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)
正如评论中提到的,您当前显示的示例并未显示您.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)
其他一切都保持不变。
| 归档时间: |
|
| 查看次数: |
4767 次 |
| 最近记录: |