En una función de Azure, el método de ejecución crea un ILogger que en mi clase principal puedo usar para registrar errores e información; sin embargo, estoy usando clases auxiliares para ejecutar mis consultas Graph API y Cosmos DB.
¿Cuál es la mejor manera de registrar errores e información en clases separadas? ¿Debería pasar el registro en todas mis clases o métodos? ¿O hay una mejor manera de hacer que ILogger esté disponible para todas las clases en tiempo de ejecución?
public class AzureFunction { public Task Run([TimerTrigger("0 0 1 * * *")] TimerInfo myTimer, ILogger log) { log.LogInformation("This message logs correctly"); GraphHelper graphHelper = new GraphHelper(); graphHelper.GetGraphData(); } } public class GraphHelper { public void GetGraphData() { try { asyncTask() } catch (Exception ex) { log.LogInformation($"{ex.Message} - How can I log this without passing ILogger to every class or method?"); } } }La forma correcta (en mi humilde opinión) es a través de la inyección de dependencia.
using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FunctionApp1 { public class HelperClass : IHelperClass { private static ILogger<IHelperClass> _logger; public HelperClass(ILogger<IHelperClass> logger) { _logger = logger; } public void Dowork() { _logger.LogInformation("Dowork: Execution Started"); /* rest of the functionality below ..... ..... */ _logger.LogInformation("Dowork: Execution Completed"); } } }anfitrión.json
{ "version": "2.0", "logging": { "applicationInsights": { "samplingExcludedTypes": "Request", "samplingSettings": { "isEnabled": true } }, "logLevel": { "FunctionApp1.HelperClass": "Information" } } }clase de ayudante
using System; using System.Collections.Generic; using System.Text; namespace FunctionApp1 { public interface IHelperClass { void Dowork(); } }Función principal
using System; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.Extensions.Logging; namespace FunctionApp1 { public class MainFunction // Ensure class is not static (which comes by default) { private IHelperClass _helper; public MainFunction(IHelperClass helper) { _helper = helper; } [FunctionName("MainFunction")] public void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log) { log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); // call helper _helper.Dowork(); } } }Inicio.cs
using Microsoft.Azure.Functions.Extensions.DependencyInjection; // install nuget - "Microsoft.Azure.Functions.Extensions" using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; [assembly: FunctionsStartup(typeof(FunctionApp1.Startup))] namespace FunctionApp1 { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddSingleton<IHelperClass,HelperClass>(); } } }Puede encontrar una muestra completa en https://gist.github.com/nareshnagpal06/82c6b4df2a987087425c32adb58312c2