Application Insights не ведет журнал с помощью функций Azure C#. Пространство имен кажется проблемой

Наша функция делегирует всю логику другому классу CreateHandler, где мы используем ILogger через DI. Функция ведет журнал правильно, а CreateHandler - нет. Локально мы проверили, что он не регистрируется в консоли, ЕСЛИ мы не изменим пространство имен класса на то, что начинается с "Function". Это означает, что FunctionR или FunctionS будут работать, а RFunction или SFunction - нет. Мы имеем дело с этим классом и услугой. Очевидно, что у нашей службы совершенно другое пространство имен, и нам нужно будет сохранить его, одновременно ведя журнал. Как мы можем сделать журнал класса без изменения пространства имен?

CreateHandler класс (ведение журнала справа):

using ExampleProject.Domain.Entities;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace FunctionAnything
{
    public class CreateHandler
    {
        private readonly ILogger<CreateHandler> _logger;

        public CreateHandler(
            ILogger<CreateHandler> logger)
        {
            _logger = logger;
        }

        public async Task Handle(Car car)
        {
            _logger.LogInformation($"This is logging properly");
        }
    }
}

CreateHandler класс (без ведения журнала):

using ExampleProject.Domain.Entities;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace ExampleProject.Functions.Handlers
{
    public class CreateHandler
    {
        private readonly ILogger<CreateHandler> _logger;

        public CreateHandler(
            ILogger<CreateHandler> logger)
        {
            _logger = logger;
        }

        public async Task Handle(Car car)
        {
            _logger.LogInformation($"This is not logging");
        }
    }
}

Запускать:

using ExampleProject.Functions.Handlers;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(ExampleProject.Functions.Startup))]
namespace ExampleProject.Functions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<CreateHandler>();
        }
    }
}

Функция:

using ExampleProject.Domain.Entities;
using ExampleProject.Functions.Handlers;
using ExampleProject.Service.Constants;
using Microsoft.Azure.WebJobs;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace ExampleProject.Functions
{
    public class Function
    {
        private readonly CreateHandler _createHandler;

        public Function(
            CreateHandler createHandler)
        {
            _createHandler = createHandler;
        }
        
        [FunctionName("Create")]
        public async Task Create([QueueTrigger(QueueNames.Create)] Car car)
        {
            log.LogInformation("I'm logged");
            await _createHandler.Handle(car);
        }
    }
}

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  }
}

host.json:

{
  "version": "2.0",
}

1 ответ

Решение

Я заметил эту проблему в github раньше (если пространство имен не запускается с помощью Function), но в настоящее время не могу ее найти.

Решение состоит в том, что вы должны добавить завершенные namespace+class имя в host.jsonесли пространство имен не начинается с Function. Как показано ниже:

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "ExampleProject.Functions.Handlers.CreateHandler": "Information"
    }
  }
}

Или общий способ:

"logLevel": { "Default": "Information" }