À l'aide d'Azure Function V3, comment injecter un Ilogger existant dans un nouveau fichier de classe?

Nov 27 2020

J'ai créé une nouvelle fonction Azure, V3, CORE 3.1, à l'aide de VS2019. Il utilise un HTTPTrigger de base. J'ai créé un nouveau fichier de classe et j'aimerais y injecter l'Ilogger existant. Comment cela peut il etre accompli? Je suis nouveau dans ce domaine, donc toute aide serait appréciée.

ÉDITER:

Donc finalement compris cela, c'était trop compliquer la question. Les fonctions V3 sont déjà configurées pour la journalisation avec ILogger, selon cet article, il y a un bogue qui filtre tout journal créé avec une catégorie qui ne commence pas par Fonction: Impossible d'utiliser l'instance ILogger fournie via DI

Tout ce que j'avais à faire était d'injecter le logger dans la classe comme ceci:

private readonly ILogger _logger;

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

Ensuite, il suffit de l'appeler comme:

_logger.LogInformation("Log Message");

Je suis allé avec l'option 1 du post ci-dessus et j'ai ajouté l'espace de noms dans le fichier host.json:

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

Réponses

1 knowonecanknow Nov 27 2020 at 05:22

J'ai une fonction qui écrit des journaux dans App Insights et j'utilise ILogger.

Vous pouvez utiliser ILogger de cette manière avec Dependency Injection dans vos autres classes de service / d'assistance.

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

J'active la journalisation dans le fichier de démarrage et j'enregistre DI.

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

Qui peut être invoqué par la classe principale.

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