为什么注入到我的Azure Function v2中的ILogger缺少APPINSIGHTS_INSTRUMENTATIONKEY?

时间:2019-03-01 13:35:47

标签: c# azure logging dependency-injection azure-functions

我有一个Azure Function v2,如下所示:

public sealed class FindAccountFunction
{
    private readonly IAccountWorkflow m_accountWorkflow;

    public FindAccountFunction(ILogger<FindAccountFunction> logger)
    {
        m_logger = logger;
    }

    [FunctionName("FindAccount")]
    public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "GET", Route = "v1/accounts/")] HttpRequest httpRequest)
    {
        // Do stuff.
        m_logger.LogInformation("Duuuddde");
    }
}

different question中所述,记录器正在注入:

[assembly: WebJobsStartup(typeof(Startup))]

public sealed class Startup : IWebJobsStartup
{
    public void Configure(IWebJobsBuilder webJobsBuilder)
    {
        // Registers other services...

        // -- UPDATE - The AddLogging must be called here --
        webJobsBuilder.Services.AddLogging();
    }
}

然后,我通过HTTP请求触发我的函数,然后转到Azure DevOps上的Function门户,以查看是否实际打印了日志:

Azure Function's portal

我只看到表明该功能成功运行的日志,但是看不到我的日志。

问题

为什么在我的Azure Function v2中注入的ILogger缺少APPINSIGHTS_INSTRUMENTATIONKEY

更新

当我查看注入的ILogger时,可以看到未设置Application Insights Provider的InstrumentationKey。对于ctor注入的ILogger,也是如此,对于Run方法中注入的ILogger也是如此。

Instrumentation key

对于我的本地测试,在local.settings.json文件中声明了检测密钥:

local.settings.json

3 个答案:

答案 0 :(得分:1)

我对不同的设置变量感到困惑(ILoggerILoggerFactory以及其他内容)。

在我的Startup类中,调用AddLogging是正确的(无论是否具有最低级别,只要它在此处或在host.json文件中定义)即可。< / p>

using InjectionHttpClientFactory;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

[assembly: WebJobsStartup(typeof(Startup))]

namespace InjectionHttpClientFactory
{
    public sealed class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder webJobsBuilder)
        {
            webJobsBuilder.Services.AddLogging();
        }
    }
}

在Azure函数中,如果我将HttpClient指定为参数,则会出错:

  

Microsoft.Extensions.DependencyInjection.Abstractions:无法执行   解决类型为“ Microsoft.Extensions.Logging.ILogger”的服务,同时   尝试激活“ XXX”

但是,如果我指定了ILoggerFactory,它确实可以工作。空的检测键属性没有任何影响。

我已经更新了host.json文件,以包括具有最低严重性级别的日志记录信息以及Application Insights的配置信息:

{
  "version": "2.0",
  "logging": {
    "fileLoggingMode": "debugOnly",
    "logLevel": {
      "default": "Trace"
    },
    "applicationInsights": {
        "samplingSettings": {
          "isEnabled": true,
          "maxTelemetryItemsPerSecond" : 5
        }
    }
  }
}

更新

如评论中所述,Microsoft发布了update,其中引入了FunctionsStartup类,这应该是首选的实现方式。

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();
            builder.Services.AddSingleton((s) => {
                return new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTIONSTRING"));
            });
            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}

答案 1 :(得分:0)

    services.AddSingleton(context => 
        {
            var factory = context.GetRequiredService<ILoggerFactory>();
            var loggingConfiguration = <get your app insights's instrumentation key from your configuration provider>;
            var logger = new LoggerConfiguration()
                    .WriteTo
                    .ApplicationInsightsEvents(loggingConfiguration.ApplicationInsightsKey)
                    .CreateLogger();
            return factory.AddSerilog(logger).CreateLogger("MyLogger");
        });

需要先通过应用程序见识配置Logger,然后才能进行遥测。设计用法(Serilog)模式可能有所不同,因为这只是一个说明。

答案 2 :(得分:-1)

记录器作为函数参数传递:

public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger log)
{
    // ...
}