ILogger не выполняет запись в ApplicationInsight, если использует DependencyInjection в функции Azure C#

#c# #azure #azure-functions

#c# #azure #azure-функции

Вопрос:

Я использую шаблон DI для функций Azure, поэтому я создал файл запуска, который выглядит как:

 [assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
  public sealed class Startup : FunctionsStartup
  {
    public override void Configure(IFunctionsHostBuilder builder)
    {
      builder.Services.AddLogging();
      builder.Services.AddTransient<IMyManager, Mymanager>();
      ...
    }
  }
}
  

и функция Azure:

 public sealed class MyFunc
{

  public MyFunc(IMyManager manager)
  {
     _myManager = manager;
  }

  [FunctionName("MyFunc")]
  public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
  {
    log.LogInformation("this is a test"); // this log appear in Application Insights
    ...
  }
  

и MyManager:

 public sealed class MyManager: IMyManager
{
   public MyManager(ILogger<MyManager> log)
   {
      _log = log;
   }
   
   public async Task ExecuteAsync(...) 
   {
      _log.LogInformation("Execute MyManager"); // this log does not appear in app insights
   }
}
  

Кажется, что ILogger или любой другой внедренный регистратор не отражается в Application Insights. Должен ли я определить его в файле host.json?

Я думал, что это должно работать на месте без внесения изменений.

Ответ №1:

Как указано в документации, предоставленной Microsoft, вы должны настроить свой host.json:

«Конфигурация файла host.json определяет, сколько журналов приложение функций отправляет в Application Insights».

Вы должны, по крайней мере, включить ведение журнала на критическом уровне.

Комментарии:

1. И если я хочу зарегистрировать всю информацию (у меня есть менеджеры с _log.LogInformation и где _log ILogger<T> ), должен ли я использовать в host.json следующем параметре: "Host.Results": "Information", "Function": "Information" ? Или достаточно "default": "Information" ?

2. @SnakeEyes Да, именно так 🙂 Будьте осторожны, это не host.config, а host.json.

3. Да, по какому вопросу? Первый или второй :)?

4. @SnakeEyes Извините, я не понял. Оба способа в порядке, «по умолчанию» будет установлено для всех регистраторов, если оно не переопределено определенной политикой, такой как «Function» или «Host.Results».