Journalisation de la fonction Azure à l’aide de TraceWriter dans une bibliothèque externe

Comment puis-je réutiliser l’object TraceWriter disponible dans une fonction azuree pour enregistrer des informations dans une bibliothèque référencée en externe? J’ai essayé de transmettre l’object à l’aide du constructeur et de référencer la classe TraceWriter (web.http.tracing). Je n’ai pas eu de chance car les cours semblent différents.

    Version abrégée Utilisez le fichier Microsoft.Azure.WebJobs.Host.TraceWriter disponible dans ce package de nuget .

    Vous pouvez également créer vos fonctions en tant que projet Web et vous pouvez déboguer localement. Vous pouvez trouver un échantillon ici .

    Version longue

    Votre problème ici est que vous utilisez le mauvais TraceWriter.

    J’ai utilisé le consignateur de fonctions Azure dans une fonction Azure pour générer le type de consignateur.

    log.Info(log.GetType().ToSsortingng()); 

    Ce qui donnait ceci:

    Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter

    Moi aussi, je m’attendais à un Web / Http TraceWriter et j’ai été surpris qu’il rest encore une autre implémentation à gérer. Microsoft pourrait vraiment faire avec la création d’une approche standard, ou au moins en nous donnant une interface propre et claire pour Erreur, Avertissement, Info, Verbose, etc. Peut-être quelque chose pour .Net Standard … s’il vous plaît.

    Je vais créer ma propre interface et envelopper mon enregistreur d’applications et celui d’Azure afin de pouvoir injecter celui dont j’ai besoin sans causer de maux de tête plus loin dans mon code. Cela offrira également une certaine protection contre la douleur potentielle infligée par les changements à venir.

    Quoi qu’il en soit, je digresse, puis j’ai suivi Microsoft.Azure.WebJobs.Script.InterceptingTraceWriter jusqu’au référentiel GitHub de script Azit Functions / Webjobs , puis au package Nuget. J’ai testé cela et cela fonctionne bien pour passer le consignateur Azure Function dans votre assemblage externe et continuer à vous connecter à l’environnement Azure Function à partir de là.

    Voici un exemple:

     using Microsoft.Azure.WebJobs.Host; public static void TryLog(TraceWriter azureeFunctionsLogger) { azureeFunctionsLogger.Info("************** IT WORKED **************"); } 

    J’adore le potentiel des fonctions Azure, mais il rest encore un peu immature et trop complexe.

    J’espère que ça aide.

    Ajout d’un enregistreur de classe unique très simple à illustrer.

    Il écrit dans l’enregistreur de fonctions Azure ou dans un système standard.Diagnostics.Trace. Vous devez coller ceci sur le contenu de Program.cs d’une application console C # standard. Vous devrez également inclure le package Nuget Microsoft.Azure.WebJobs .

     namespace LoggingTestConsole { using System; ///  /// Generic logging interface for portability ///  public interface ILogger { void Error(ssortingng message); void Information(ssortingng message); void Warning(ssortingng message); } ///  /// Azure Functions logger ///  public class AzureFunctionLogger : ILogger { private static Microsoft.Azure.WebJobs.Host.TraceWriter _logger; public AzureFunctionLogger(Microsoft.Azure.WebJobs.Host.TraceWriter logger) { _logger = logger; } public void Error(ssortingng message) { _logger.Error(message); } public void Information(ssortingng message) { _logger.Info(message); } public void Warning(ssortingng message) { _logger.Warning(message); } } ///  /// Windows Trace logger ///  public class TraceLogger : ILogger { public TraceLogger() { System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener(Console.Out)); } public void Error(ssortingng message) { System.Diagnostics.Trace.TraceError(message); } public void Information(ssortingng message) { System.Diagnostics.Trace.TraceInformation(message); } public void Warning(ssortingng message) { System.Diagnostics.Trace.TraceWarning(message); } public void Warning(ssortingng format, params object[] args) { System.Diagnostics.Trace.TraceWarning(format, args); } } ///  /// You would put this in a separate project and just share the ILogger interface. /// Pass the relevant logger in from Azure Functions or a standard windows Trace logger. ///  public class DoStuff { public DoStuff(ILogger logger) { logger.Information("We are logging to logger you passed in!"); } } public class Program { ///  /// Sample usage ///  static void Main(ssortingng[] args) { // var loggerEnvironment = "AzureFunctions"; var loggerEnvironment = "ConsoleApp"; ILogger logger = null; if (loggerEnvironment == "AzureFunctions") { Microsoft.Azure.WebJobs.Host.TraceWriter azureeFunctionLogger = null; logger = new AzureFunctionLogger(azureeFunctionLogger); } else if (loggerEnvironment == "ConsoleApp") { logger = new TraceLogger(); } var doStuff = new DoStuff(logger); Console.ReadKey(); } } } 

    En tant que mise à jour, Azure Functions prend désormais en charge la consommation d’un ILogger au lieu de TraceWritter afin que vous puissiez consumr n’importe quelle ILogger journalisation qui implémente ILogger .

    Voir le numéro de GitHub et la documentation subséquente du wiki .

    Si je ne me trompe pas, les versions nécessaires pour qu’ILogger fonctionne avec les fonctions Azure sont Microsoft.Azure.WebJobs 2.1.0-beta1. Cependant, je n’arrive pas à faire fonctionner une fonction Azure à l’aide d’un ILogger au lieu d’un TraceWriter.

    De plus, très peu d’informations et de documentation sont disponibles sur le développement de fonctions Azure à l’aide d’ILogger. Quelqu’un at-il plus d’informations ou de conseils pour que cela fonctionne?

    Mon extrait de code C #:

     using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.ServiceBus; using System; using Newtonsoft.Json; using Microsoft.Extensions.Logging; namespace Experimental.Functions { public static class ListenToEventFunction { [FunctionName("ListenToEventFunction")] public static void Run([EventHubTrigger("events", Connection = "EventHubConnectionSsortingng")]ssortingng myEventHubMessage, ILogger log) { log.LogInformation($"C# Event Hub sortinggger function processed a message: {myEventHubMessage}"); } } } 

    L’erreur suivante s’affiche lors du débogage de ma fonction Azure à l’aide des outils de fonction Azure pour VS2017:

     A ScriptHost error has occurred Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.EnrichTelemetryLocation'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'log' to type ILogger. Make sure the parameter Type is supported by the binding. If you're using binding extensions (eg ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (eg config.UseServiceBus(), config.UseTimers(), etc.).