【问题标题】:Create ILogger instance in Startup在 Startup 中创建 ILogger 实例
【发布时间】:2020-04-02 13:53:06
【问题描述】:

我正在开发带有 Polly 重试和断路器的 Azure Function App .net core 3.1。到目前为止,我使用构建器将详细信息记录到 App Insights 没有问题,因为它在执行如下所示之前不会被初始化

    private static void AddPoliciesAsync(this IHttpClientBuilder builder)
    {
        builder.AddPolicyHandler((service, request) =>
        GetRetryAsyncPolicy(service.GetService<ILogger<HTTPTrigger1>>()).WrapAsync(
        GetCircuitBreakerAsyncPolicy(service.GetService<ILogger<HTTPTrigger1>>())));
    }

其中 HTTPTrigger1 是用于测试的函数应用名称。现在我需要扩展现有的功能来检查电路是否损坏,以便我可以运行另一组业务功能。对于这里提到的https://github.com/App-vNext/Polly#circuit-breaker,我添加了 CB 的单例实例以确保读取断路器状态。

        var logger = services.BuildServiceProvider().GetService<ILogger<HTTPTrigger1>>();
        var circuitBreaker = GetCircuitBreakerAsyncPolicy(logger);
        services.AddSingleton(circuitBreaker as ICircuitBreakerPolicy<HttpResponseMessage>);
        services.AddHttpClient("name", client =>
        {
            // something
        })
        .AddPollyPolicies(logger, circuitBreaker);

但是在第二个实现中获取记录器实例时出现错误。正如我在 MS 文档中检查的 https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#caveats 说在启动期间不要记录消息,即使正在创建实例,它仍然会引发错误(后续调用需要实习生)。无论如何我可以在这里实现日志记录吗?

【问题讨论】:

    标签: .net-core startup asp.net-core-3.1 azure-function-app ilogger


    【解决方案1】:

    为什么不直接使用 AddSingleton 工厂重载?

    services.AddSingleton(sp => {
        var logger = sp.GetService<ILogger<HTTPTrigger1>>();
        var circuitBreaker = GetCircuitBreakerAsyncPolicy(logger);
        return circuitBreaker as ICircuitBreakerPolicy<HttpResponseMessage>;
    });
    

    【讨论】:

    • 因为,我需要使用断路器实例来使用重试策略来包装它,services.AddHttpClient("name", client => { // something }) .AddPollyPolicies(logger, circuitBreaker) ;
    • 这听起来像是自伤。什么是AddPollyPolicies,是否可以从服务提供者那里获取记录器/断路器,而不是作为参数传递?
    • 我试图从服务提供商那里获取记录器,但它抛出了错误。 var logger = services.BuildServiceProvider().GetService>();不知道注册后能不能从服务商那里拿到熔断政策! ?这是 AddPollyPolicies => builder.AddPolicyHandler(breaker.WrapAsync(GetRetryPolicy(logger)));
    • AddPolicyHandler 的重载使用具有可用服务提供商的工厂。如果您已将断路器注册为单例,您将始终获得相同的实例。简而言之,所有这些都可以通过工厂来完成。您不需要直接在 Startup 中实际构建它。
    • 我从未尝试过,会弄清楚的。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 2013-05-29
    • 2012-10-19
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多