Azure Functions: .NET 8 aislado: el registro ya no aparece en los seguimientos de invocación del portal de Azure

Resuelto marc_s asked hace 54 años • 1 respuestas

Al escribir Azure Functions en C#, me resulta muy útil poder enviar algunos mensajes seleccionados a un registrador y que esos mensajes aparezcan en las "Seguimientos de invocación" del Portal de Azure:

Esto ha funcionado muy bien, desde la función Azure v1 hasta las escritas en .NET 6.0 aislado.

Visualización del seguimiento de invocación del portal de Azure hasta .NET 6.0

Pero ahora, he creado algunas funciones nuevas más, usando .NET 8.0 aislado, y ahora parece que generar esos mensajes de registro/rastreo ya no funciona...

Visualización del seguimiento de invocación del portal de Azure ahora en .NET 8.0

¿Qué ha cambiado tan fundamentalmente que mi registro ya no aparece en Azure Portal?

En este momento, estoy inyectando ILoggerFactoryen mi clase de función de Azure y creando una ILogger<T>a partir de ella (¿dónde Testá el tipo de mi clase de función?).

public class MyAzureFunction
{
    private readonly IConfiguration _configuration;
    private readonly ILoggerFactory _factory;
    private readonly ILogger<MyAzureFunction> _logger;

    public MyAzureFunction(IConfiguration configuration, ILoggerFactory factory)
    {
        _configuration = configuration;
        _factory = factory;
        _logger = factory.CreateLogger<MyAzureFunction>();
    }
    
    // Actual Azure Function code follows here
}

También intenté usar FunctionContextcomo parámetro inyectable para mi método de función de Azure que se activa (mediante una llamada HTTP o un temporizador) y crear a ILogger<T>partir de eso:

[Function("MyAzureFunction")]
public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req, 
                                     FunctionContext executionContext)
{
    ILogger _logger = executionContext.GetLogger(nameof(MyAzureFunction));
    
    _logger.LogInformation("My Azure Function was HTTP triggered");
    
    // rest of the function code
}

Ninguno de estos enfoques parece funcionar: ninguno de mis propios mensajes personalizados, generados por_logger.LogInformation , aparece en la pantalla "Seguimientos de invocación" del Portal de Azure.

También he jugado con varias configuraciones en el _host.json- pero sin éxito - y sin saber exactamente dónde radica el problema y cómo solucionarlo, todo esto parece un poco complicado de "prueba y error" sin entender realmente qué cuál es el problema y cómo solucionarlo.

¿Alguien puede iluminarme? ¿Qué me estoy perdiendo? ¿Qué ha cambiado con la compatibilidad con .NET 8.0 en Azure Functions? ¿Cómo puedo hacer que mis propios mensajes personalizados vuelvan a aparecer en Azure Invocation Traces?

marc_s avatar Jan 01 '70 08:01 marc_s
Aceptado

Debes llamar AddApplicationInsightsTelemetryWorkerService()y ConfigureFunctionsApplicationInsights()durante la configuración del servicio en tu Program.csarchivo:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
    
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

Tenga en cuenta también que, de forma predeterminada, el SDK de Application Insights agrega un filtro de registro que indica al registrador que capture solo advertencias y registros más graves. Si desea deshabilitar este comportamiento, elimine la regla de filtro como parte de la configuración del servicio:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services => {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .ConfigureLogging(logging =>
    {
        logging.Services.Configure<LoggerFilterOptions>(options =>
        {
            LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule => rule.ProviderName
                == "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
            if (defaultRule is not null)
            {
                options.Rules.Remove(defaultRule);
            }
        });
    })
    .Build();

host.Run();
Kristoffer Jälén avatar Feb 16 '2024 09:02 Kristoffer Jälén