Serilog的实现打破了其他配置



在我们的项目中实现serilog。我们已经实现了AspNetCoreRateLimit来调用API。该项目是一个.Net Core项目,但由于某些依赖关系,它以Net461为目标构建。

在serilog之前,api还不错。

现在已经安装了serilog,我们收到了一个错误。

在引入serilog之前,调用这个函数会出现错误。

services.Configure<IpRateLimitOptions>(_configuration.GetSection("IpRateLimiting"));

Startup()具有:

Log.Logger = new LoggerConfiguration()
.WriteTo.File("Logs/FSCPAPI-{Date}.log")
.CreateLogger();

以下内容在Configure()中

loggerfactory.AddSerilog();

错误来自服务。配置<>()是:

发生

System.TypeLoadExceptionHResult=0x80131522Message=程序集"Microsoft.Extensions.Options.ConfigurationExtensions,Version=1.1.2.0,Culture=neutral,PublicKeyToken=adb9793829ddae60"中类型"Microsoft.Extensions.Options.ConfigorationChangeTokenSource"1"中的方法"get_Name"没有实现。Source=Microsoft.Extensions.Options.ConfigurationExtensionsStackTrace:位于Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure[TOptions](IServiceCollection服务,IConfiguration配置)位于C:\Users\saynot\Documents\Repos\NGB.IFS.PurchApp\NGB.ifns.purchap\NGB.IFS.PurchApp.Services\Startup.cs:line 86 中的NGB.IFS.PurchApp.ConfigureServices(IServiceCollection服务)

我安装了serilog、serilog.extensions.logging和serilog.sinks.file Nuget软件包。

来自Serial.Extensions.Logging Github项目:

ASP.NET Core 2.0应用程序应该更喜欢Serial.AspNetCore和UseSerilog()

删除Serialog和Serial.Extensions.Logging包。然后,使用安装Serial.AspNetCore软件包

PM> Install-Package Serilog.AspNetCore -DependencyVersion Highest

如果您需要使用AspNetCoreRateLimit实现serilog的示例,我会覆盖并使其工作。

public static class RateLimitSerilogExtensions
{
public static IApplicationBuilder UseCustomIpRateLimiting(this IApplicationBuilder builder)
{
return builder.UseMiddleware<IpRateLimitMiddlewareCustom>();
}
} 
public class IpRateLimitMiddlewareCustom : IpRateLimitMiddleware
{
private readonly Microsoft.Extensions.Logging.ILogger _logger;
private readonly IHostEnvironment _env;
private readonly ILogger _serilogger; 
public IpRateLimitMiddlewareCustom(RequestDelegate next, IOptions<IpRateLimitOptions> options, IRateLimitCounterStore counterStore, IIpPolicyStore policyStore, Microsoft.Extensions.Logging.ILogger<IpRateLimitMiddleware> logger, IRateLimitConfiguration config,
IHostEnvironment env, ILogger serLog) : base(next, options, counterStore, policyStore, config, logger)
{
_logger = logger;
_serilogger = serLog;
_env = env;

}
protected override void LogBlockedRequest(HttpContext httpContext, ClientRequestIdentity identity, RateLimitCounter counter, RateLimitRule rule)
{
_serilogger
.ForContext("Blocked by rule", rule.Endpoint)
.ForContext("TraceIdentifier", httpContext.TraceIdentifier)
.ForContext("Quota", rule.Limit + "/" + rule.Period)
.ForContext("Exceeded By", counter.Count)
.Information("EService limit reached");

}
}

在启动时,您必须首先调用此方法,然后再调用nuget包附带的方法

app.UseCustomIpRateLimiting();
app.UseIpRateLimiting();

最新更新