Usando Azure Function V3, ¿cómo puedo inyectar Ilogger existente en un nuevo archivo de clase?

Nov 27 2020

He creado una nueva función de Azure, V3, CORE 3.1, usando VS2019. Utiliza un HTTPTrigger básico. He creado un nuevo archivo de clase y me gustaría inyectar el Ilogger existente en él. ¿Cómo se puede lograr esto? Soy nuevo en esto, por lo que cualquier ayuda sería apreciada.

EDITAR:

Así que finalmente resolví esto, se acabó complicando el asunto. Las funciones de V3 ya están configuradas para iniciar sesión con ILogger, de acuerdo con esta publicación hay un error que filtra cualquier registro creado con una categoría que no comienza con Función: No se puede usar la instancia de ILogger proporcionada a través de DI

Todo lo que necesitaba hacer era inyectar el registrador en la clase así:

private readonly ILogger _logger;

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

Entonces simplemente lo llamo como:

_logger.LogInformation("Log Message");

Fui con la opción 1 de la publicación anterior y agregué el espacio de nombres en el archivo host.json:

"logLevel": {
      "NamespaceName": "Information"
    }

Respuestas

1 knowonecanknow Nov 27 2020 at 05:22

Tengo una función que escribe registros en App Insights y uso ILogger.

Puede usar ILogger así con Dependency Injection en sus otras clases de servicio / ayuda.

public interface IExampleClass
{
    void ExampleMethod();
}

public class ExampleClass : IExampleClass
{
    private readonly ILogger<ExampleClass> _logger;

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

    public void ExampleMethod()
    {
       _logger.LogInformation("Example info log");
    }
}

Habilito el inicio de sesión en el archivo de inicio y registro DI.

class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddLogging();
        builder.Services.AddTransient<ExampleClass, IExampleClass>();
    }
}

Que puede ser invocado por la clase principal.

public class ThisIsAnAzureFunction
{
    private readonly IExampleClass _exampleClass;

    public ThisIsAnAzureFunction(IExampleClass exampleClass)
    {
        _exampleClass = exampleClass;
    }

    [FunctionName("SomeAzureFunctionName")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
    {
        try
        {
            //Try some stuff
        }
        catch (Exception exception)
        {
            //Log some stuff
            log.LogError(exception);
            throw;
        }
    }
}