【问题标题】:Difference between ILogger, ILoggerFactory and ILogger<> with MS logging on Azure Functions 2在 Azure Functions 2 上使用 MS 日志记录的 ILogger、ILoggerFactory 和 ILogger<> 之间的区别
【发布时间】:2019-10-18 01:48:02
【问题描述】:

更新

在支持 Application Insights 的 Azure Functions 2 上使用 MS 日志记录的 ILoggerFactory 和 ILogger 有什么区别?

代码如下:

    public class Functions
    {
        //other code
        private ILogger _log;

        public Functions(ILoggerFactory loggerFactory, ILogger<Functions> log)
        {
            _log = loggerFactory.CreateLogger<Functions>();
            _log = log;
        }

        [FunctionName("Token")]
        public async Task<IActionResult> Function1(
            [HttpTrigger()]...)
        {
               _log.LogInformation("Function1 invoked");
        }
    }

更新 2

日志记录器: 如果使用 ILogger 作为构造函数参数,则会出现以下错误。 如果用作函数参数,它就可以工作。

ILogger 实例的服务生命周期是多少?

是否有计划在 CTOR 上支持它?

[04/06/2019 10:06:12] Executed 'SampleFunction' (Failed, Id=3912a5b7-10fa-41e1-9
0f8-fba9d2cda49b)
[04/06/2019 10:06:12] Microsoft.Extensions.DependencyInjection.Abstractions: Una
ble to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while att
empting to activate 'Microsoft.Azure.Functions.Samples.DependencyInjectionBasic.
SampleFunction'.
[04/06/2019 10:06:12] An unhandled host error has occurred.
[04/06/2019 10:06:12] Microsoft.Extensions.DependencyInjection.Abstractions: Una
ble to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while att
empting to activate 'Microsoft.Azure.Functions.Samples.DependencyInjectionBasic.
SampleFunction'.

【问题讨论】:

标签: azure azure-functions azure-functions-runtime


【解决方案1】:

如果您只想使用默认的日志记录支持,即记录到 Application Insights,您只想使用 ILogger 实例作为函数签名的参数。请注意,这与您在问题中提到的ILogger&lt;T&gt; 是分开的。例如,查看official documentation

如果您想使用自定义日志记录,最好的方法是使用新的Dependency Injection support for Azure Functions 实现自定义ILoggerProvider

【讨论】:

  • 谢谢,我更新了提到 Application Insight 的 OP。 ILogger&lt;T&gt; 没有被提及。问题是 ILogger 导致 IoC 无法解决的异常。我不确定是不是只有我。
  • ILogger&lt;T&gt;,我指的是您发布的代码示例中的ILogger&lt;Functions&gt;。正确的类型只是ILogger,而不是参数化类型。我链接到的文档中的示例代码显示了这一点。如果这也给了您例外情况,请在问题中发布这些例外情况。
  • 为什么不ILogger&lt;T&gt;ILoggerFactory?有四种不同的类型。我认为ILoggerFactory 会更高效。 ILoggerILoggerProvider 在性能、线程和 IO 写入等方面是否最适合您提到的场景?
  • 我不确定选择这些类型的确切原因,但 Functions 使用依赖项注入来确保它提供了一个记录到 Application Insights 的 ILogger 实现。它们不提供ILogger&lt;T&gt;ILoggerFactory 的实现,可能是因为支持这些类型的实现需要大量的开发资源。这样一来,所有的开发都可以确保实现对于尽可能多的场景是最优的。对于ILoggerProvider,您提供自己的实现,因此它的性能与您编写的一样。
  • 我将此ILogger&lt;T&gt;ILoggerFactorygithub.com/serilog/serilog-sinks-applicationinsights 一起使用,Application Insight 工作。它们在性能方面仍然很好用吗?
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2021-09-21
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2018-12-23
  • 2020-12-03
相关资源
最近更新 更多