Почему в моей функции Azure v2 для ILogger отсутствует APPINSIGHTS_INSTRUMENTATIONKEY? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть функция Azure 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");
    }
}

Как описано в другом вопросе , вводится логгер:

[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-запрос и захожу на портал функций в DevOps Azure, чтобы посмотреть, распечатаны ли журналы:

Azure Function's portal

Я толькосм. журналы, указывающие на успешное выполнение функции, однако я не вижу свой журнал.

Вопрос

Почему в 1023 * в моем Azure Function v2 отсутствует *APPINSIGHTS_INSTRUMENTATIONKEY?

Обновление

Когда я смотрю на введенный ILogger, я вижу, что InstrumentationKey поставщика Application Insights не установлен.То же самое относится к ILogger, введенному в ctor, но также и для введенного ILogger в методе Run.

Instrumentation key

Для моих локальных тестов приборное оборудованиеключ объявлен в файле local.settings.json:

local.settings.json

Ответы [ 3 ]

0 голосов
/ 01 марта 2019
    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");
        });

Регистратор должен быть настроен до использования телеметрии с вашими приложениями.Шаблон Design Usage (Serilog) может отличаться, так как это просто заглушка для объяснения.

0 голосов
/ 06 марта 2019

Я запутался с различными вариантами настройки (ILogger против ILoggerFactory против других вещей).

В моем классе 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: Невозможно разрешить службу для типа «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 выпустила обновление , которое вводит класс 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 голосов
/ 01 марта 2019

Логгер передается как аргумент функции:

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