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