J'ai une fonction Azure v2, comme celle-ci:
[assembly: WebJobsStartup(typeof(Startup))] public sealed class Startup : IWebJobsStartup { public void Configure(IWebJobsBuilder webJobsBuilder) { // Registers other services... // -- UPDATE - The AddLogging must be called here -- webJobsBuilder.Services.AddLogging(); } }
Comme décrit dans un question différente , le logger est injecté:
public sealed class FindAccountFunction { private readonly IAccountWorkflow m_accountWorkflow; public FindAccountFunction(ILogger<FindAccountFunction> logger) { m_logger = logger; } [FunctionName("FindAccount")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "GET", Route = "v1/accounts/")] HttpRequest httpRequest) { // Do stuff. m_logger.LogInformation("Duuuddde"); } }
Ensuite, je déclenche ma fonction via une requête HTTP et je vais sur le portail de la fonction sur Azure DevOps pour voir si les journaux sont réellement imprimés:
Je ne vois que les journaux indiquant que la fonction s'est exécutée avec succès mais je ne vois pas mon journal.
Question
Pourquoi le ILogger
injecté dans ma fonction Azure v2 manque-t-il la APPINSIGHTS_INSTRUMENTATIONKEY
?
Update
Quand je regarde le ILogger
injecté, je peux voir que l'instrumentationKey de l'Application Insights P rovider n'est pas défini. Il en va de même pour un ILogger injecté par ctor, mais aussi pour le ILogger
injecté dans la méthode Run.
Pour mes tests locaux, la clé d'instrumentation est déclarée dans le fichier local.settings.json
:
3 Réponses :
Logger est passé comme argument de fonction:
public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger log) { // ... }
La fonction Azure d'exécution la plus récente permet à ILogger d'être injecté non seulement dans la fonction elle-même, mais également dans les services injectés. Même si j'ajoute ILogger à la méthode Run elle-même, j'aurai probablement le même problème avec les services: où verrai-je les journaux de ces services?
D'accord. Avez-vous jeté un œil à github.com/Ruard/ProcsIT.Azure.Functions.DependencyInjection < / a>? Je n'ai pas essayé.
Cela ne semble pas être lié à mon problème: cela ressemble à une solution personnalisée avec un attribut personnalisé nommé Inject. J'utilise services.AddLogging (); qui est censé faire tout cela.
services.AddSingleton(context => { var factory = context.GetRequiredService<ILoggerFactory>(); var loggingConfiguration = <get your app insights's instrumentation key from your configuration provider>; var logger = new LoggerConfiguration() .WriteTo .ApplicationInsightsEvents(loggingConfiguration.ApplicationInsightsKey) .CreateLogger(); return factory.AddSerilog(logger).CreateLogger("MyLogger"); }); Logger needs to be configured prior to ingest telemetry with your app-insights. Design Usage(Serilog) pattern may be different as this is just a stub to explain.
Je me suis trompé avec différentes variantes de configuration ( ILogger
vs ILoggerFactory
par rapport à d'autres choses).
Dans ma classe Startup
, il est correct d'appeler AddLogging
(avec un niveau minimum ou non, à condition qu'il soit défini quelque part ici ou dans le host.json
file).
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))] namespace MyNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddHttpClient(); builder.Services.AddSingleton((s) => { return new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTIONSTRING")); }); builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>(); } } }
Dans la fonction Azure, j'ai une erreur si je spécifie HttpClient
comme paramètre:
Microsoft.Extensions.DependencyInjection.Abstractions: impossible de résoudre le service pour le type «Microsoft.Extensions.Logging.ILogger» pendant tentative d'activation de «XXX»
Cependant, cela fonctionne si je spécifie un ILoggerFactory
. La propriété de la clé d'instrumentation qui était vide n'a en quelque sorte aucun impact.
J'ai mis à jour le fichier host.json
pour inclure les informations de journalisation avec le niveau de gravité minimum ainsi que les informations de configuration pour Application Insights:
{ "version": "2.0", "logging": { "fileLoggingMode": "debugOnly", "logLevel": { "default": "Trace" }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond" : 5 } } } }
Comme mentionné dans les commentaires, Microsoft a publié un update qui introduit le code FunctionsStartup > classe qui devrait être la meilleure façon de faire cela.
using InjectionHttpClientFactory;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
[assembly: WebJobsStartup(typeof(Startup))]
namespace InjectionHttpClientFactory
{
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
webJobsBuilder.Services.AddLogging();
}
}
}
Je pense que c'est quelque peu obsolète maintenant, devrait utiliser FunctionsStartup à la place.
Quelle est l'implémentation de MyLoggerProvider?
@ JoãoAntunes C'est à vous de définir votre propre fournisseur. Cet extrait de code spécifique provient de la documentation de Microsoft (voir docs.microsoft.com/en-us/azure/azure-functions/... ).