【问题标题】:Serilog implementaiton breaking other configurationSerilog 实现打破其他配置
【发布时间】:2017-10-27 14:37:51
【问题描述】:

在我们的项目中实现 serilog。我们已经实现了 AspNetCoreRateLimit 来限制对 API 的调用。该项目是一个 .Net Core 项目,但由于某些依赖项而针对 Net461 构建。

在 serilog 之前,api 很好。

现在安装了 serilog,我们遇到了一个错误。

在引入 serilog 之前调用 this 会导致错误冒泡。

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

Startup() 有:

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

下面是在Configure()中

loggerfactory.AddSerilog();

来自 services.Configure() 的错误是:

发生 System.TypeLoadException H结果=0x80131522 Message=Method 'get_Name' in type 'Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1' from assembly 'Microsoft.Extensions.Options.ConfigurationExtensions, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' 没有实现。 Source=Microsoft.Extensions.Options.ConfigurationExtensions 堆栈跟踪: 在 Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure[TOptions](IServiceCollection 服务,IConfiguration 配置) 在 C:\Users\saynort\Documents\Repos\ngb.ifs.purchapp\ngb.ifs.purchapp\NGB.IFS.PurchApp.Services\Startup 中的 NGB.IFS.PurchApp.Services.Startup.ConfigureServices(IServiceCollection 服务)。 cs:第 86 行

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

【问题讨论】:

    标签: c# .net .net-core asp.net-core-webapi serilog


    【解决方案1】:

    来自Serilog.Extensions.Logging Github project

    ASP.NET Core 2.0 应用程序应该更喜欢 Serilog.AspNetCoreUseSerilog()

    删除 Serilog 和 Serilog.Extensions.Logging 包。然后,使用以下命令安装 Serilog.AspNetCore 包:

    PM> Install-Package Serilog.AspNetCore -DependencyVersion Highest
    

    【讨论】:

    • 谢谢。我会试试看它是否更无缝!
    • 我试了一下,但恐怕这个解决方案只适用于 .Net Core 2 项目。这不是。如果我尝试升级,由于构建和依赖关系,我可以执行以下操作:我得到的错误是“Package Microsoft.AspNetCore.All 2.0.0 is not compatible with net461”。这是我的目标构建,因为我必须包含(第三方)的依赖项。
    • 我一定是疯了,因为我可以发誓你曾在问题的某个时候提到过使用 ASP.NET Core 2.0。无论如何,你最好还是升级。 .NET Core 2.0 实现了 .NET Standard 2.0,这意味着您现在可以使用几乎任何 .NET Framework 库。因此,实际上不再需要在完整的框架上运行,除非您引用的库确实有一些 Windows 特定的东西。
    • 我认为某种形式的混合在这里起作用:而不是包含 .All 核心依赖项。我有 AspNetCore、AspNetCore.Mvc.Core 和 AspNetCore.MVC.Formatters.Json。最终结果是 Core 2 Nuget 包,但没有错误目标 net461。我确实必须从启动中删除 services.AddMVC() 但是因为它引发了“未实现”异常。但是,我已经有了 services.AddMvcCore() ,并且一切正常并且似乎可以运行。老实说,我很高兴工作,并且日志记录也在工作,但不确定我取出了什么以及那里的影响!
    • 关于您的评论。恐怕我别无选择,只能瞄准 461 全脂以使用第三方提供商。您如何看待这种看似混合的方法。必须说我有点困惑为什么这会起作用,因为提到的组件是 2.0.0 版本。只需要删除 AddMVC()
    【解决方案2】:

    如果您需要使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多