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

问题描述 投票:1回答:3

我有一个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上的函数门户以查看日志是否实际打印:

Azure Function's portal

我只看到指示该功能成功运行的日志,但是我没有看到我的日志。

为什么我的Azure Function v2中注入的ILogger错过了APPINSIGHTS_INSTRUMENTATIONKEY

更新

当我查看注入的ILogger时,我可以看到Application Insights Provider的InstrumentationKey未设置。这同样适用于注射ILogger的ctor,也适用于Run方法中注入的ILogger

Instrumentation key

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

local.settings.json

c# azure logging dependency-injection azure-functions
3个回答
2
投票

我对不同的设置变种感到困惑(ILogger vs ILoggerFactory vs其他东西)。

在我的Startup类中,调用AddLogging(最低级别与否,只要它在此处或host.json文件中定义)是正确的。

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:尝试激活“XXX”时无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务

但是,如果我指定ILoggerFactory,它确实有效。以某种方式为空的检测键属性没有任何影响。

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

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

更新

正如评论中所提到的,微软发布了一个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>();
        }
    }
}

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");
        });

需要在使用您的应用洞察进行摄取遥测之前配置记录器。设计用法(Serilog)模式可能不同,因为这只是一个存根来解释。


-1
投票

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

public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger log)
{
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.