es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reemplazo de TraceFilter en Azure.WebJobs 3.0+

Estoy actualizando de Microsoft.Azure.WebJobs 2.0.0 a 3.0.30. En nuestro código existente, tenemos código personalizado que utiliza el TraceFilter del SDK anterior, que ya no está presente.

¿Hay alguna manera de migrar el siguiente código que depende de JobHostConfiguration y TraceFilter al nuevo SDK?

En Program.Main():


// config era un JobHostConfiguration, que no está presente en el nuevo SDK
config.Tracing.Tracers.Add(new TraceMonitor()
.Filter(e => (e.Exception is FunctionInvocationException fie ? fie.InnerException : e.Exception)?.IsMonitored() ?? false, "Manejador de excepciones")
.Subscribe(Process));


public void Process(TraceFilter filter)
{
var events = filter.GetEvents().Where(e => e.Exception != null);
foreach (var traceEvent in events) {
...
}
}

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de adaptar el código que depende de JobHostConfiguration y TraceFilter al nuevo SDK. En el nuevo SDK, TraceFilter ha sido reemplazado por ILoggerFactory.

    Para modificar el código existente para que funcione con el nuevo SDK, puedes hacer lo siguiente:

    1. Crea una clase que implemente la interfaz Microsoft.Extensions.Logging.ILoggerProvider. Esto se hace creando una clase e implementando el método CreateLogger para devolver una nueva instancia de ILogger:
    public class MyLoggerProvider : ILoggerProvider
    {
        public ILogger CreateLogger(string categoryName)
        {
            return new MyLogger();
        }
    
        public void Dispose() { }
    }
    
    1. Crea una clase que implemente la interfaz Microsoft.Extensions.Logging.ILogger. Esto se hace creando una clase e implementando los diferentes métodos de registro como LogDebug, LogInformation, etc.
    public class MyLogger : ILogger
    {
        public void Log<tstate>(
            LogLevel logLevel, EventId eventId,
            TState state, Exception exception,
            Func<tstate, exception,="" string=""> formatter)
        {
            Process(exception);
        }
    
        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }
    
        public IDisposable BeginScope<tstate>(TState state)
        {
            return null;
        }
    }
    
    1. En el método Program.Main, crea una nueva instancia de ILoggerFactory y agrega tu MyLoggerProvider a él. Luego, úsalo para crear un objeto JobHostConfiguration y pásalo al constructor de JobHost:
    var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder.AddProvider(new MyLoggerProvider());
    });
    
    var config = new JobHostConfiguration
    {
        LoggerFactory = loggerFactory
    };
    
    var host = new JobHost(config);
    
    1. Modifica tu método Process para aceptar una instancia de ILogger:
    public void Process(ILogger logger)
    {
       // tu código existente aquí
    }
    
    1. Por último, en tu objeto config, registra una instancia de tu ILogger en la colección de services:
    config.Services.AddSingleton<mylogger>();
    

    Con estas modificaciones, tu código existente debería funcionar con el nuevo SDK. Ten en cuenta que es posible que debas modificar el método Process para que funcione con la nueva interfaz ILogger en lugar de la antigua interfaz TraceFilter.</tstate,>

Comments are closed.