Registrar consultas SQL de EntityFrameworkCore en la consola con Hangfire

Para visualizar las consultas SQL generadas por Entity Framework Core en la consola, se requiere configurar un ILoggerFactory. Este enfoque utiliza un proveedor de registro de consola.

public static readonly ILoggerFactory DbConsoleLoggerFactory
    = LoggerFactory.Create(builder => { builder.AddConsole(); });

Después, registre esta instancia en el DbContextOptionsBuilder dentro del método OnConfiguring.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(DbConsoleLoggerFactory)
        .UseSqlServer("TuCadenaDeConexion");

Filtrar los mensajes de registro

Puede controlar qué se registra aplicando filtros al proveedor de ILogger. Por ejemplo, para mostrar solo comandos de base de datos a nivel informativo:

public static readonly ILoggerFactory DbConsoleLoggerFactory
    = LoggerFactory.Create(builder =>
        {
            builder
                .AddFilter((category, level) =>
                    category == DbLoggerCategory.Database.Command.Name
                    && level == LogLevel.Information)
                .AddConsole();
        });

Integración en el framework ABP

En un proyecto basado en ABP, diríjase al proyecto *.EntityFrameworkCore. Localice la clase que hereda de DbContext e incorpore el siguiente código:

public static readonly ILoggerFactory AbpLoggerFactory
    = LoggerFactory.Create(builder =>
    {
        builder
            .AddFilter((category, level) =>
                category == DbLoggerCategory.Database.Command.Name
                && level == LogLevel.Information)
            .AddConsole();
    });

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(AbpLoggerFactory)
        .EnableSensitiveDataLogging(true);

Configuración de Hangfire para tareas en segundo plano

Instale el paquete NuGet de Hangfire. Luego, modifique el módulo de enicio de la aplicación para registrar los servicios de Hangfire.

using Hangfire;
using Microsoft.Extensions.Configuration;

public void ConfigureServices(IServiceCollection services)
{
    // Otras configuraciones...
    ConfigurarHangfire(services, Configuration);
}

private void ConfigurarHangfire(IServiceCollection servicios, IConfiguration configuracion)
{
    servicios.AddHangfire(config =>
    {
        config.UseRedisStorage(configuracion["Redis:ConnectionString"]);
        // Alternativa: config.UseMemoryStorage();
    });
    servicios.AddHangfireServer();
    servicios.AddTransient<tareaensegundoplano>();
}
</tareaensegundoplano>

Imlpementar un servicio con Hangfire

Cree una clase que contenga la lógica para ejecutar tareas de forma asíncrona.

public class TareaEnSegundoPlano
{
    private readonly IRepositorioLibros _repoLibros;

    public TareaEnSegundoPlano(IRepositorioLibros repoLibros)
    {
        _repoLibros = repoLibros;
    }

    public async Task ProcesarNuevoLibro(LibroDto datosLibro)
    {
        Console.WriteLine($"Tarea iniciada a las {DateTime.Now}");
        await _repoLibros.AgregarLibroAsync(datosLibro);
        Console.WriteLine($"Tarea finalizada a las {DateTime.Now}");
    }
}

Ejemplo de uso y pruebas

En un controlador, encole la tarea en Hangfire y mida el rendimiento.

[HttpGet("crear-libro")]
public async Task<actionresult>> CrearLibro()
{
    var reloj = new Stopwatch();
    reloj.Start();

    var datosLibro = new LibroDto { Titulo = "Nuevo Libro", Autor = "Autor Ejemplo" };
    var resultado = await _servicioLibros.AgregarLibroAsync(datosLibro);

    reloj.Stop();
    Console.WriteLine($"Operación directa: {reloj.ElapsedMilliseconds} ms");

    reloj.Restart();
    for (int i = 0; i < 1000; i++)
    {
        BackgroundJob.Enqueue<tareaensegundoplano>(t => t.ProcesarNuevoLibro(resultado));
    }
    reloj.Stop();
    Console.WriteLine($"Encolamiento en Hangfire: {reloj.ElapsedMilliseconds} ms");

    return resultado;
}
</tareaensegundoplano></actionresult>

Acceda al penel de Hangfire en la ruta /hangfire de su aplicación para monitorear las tareas.

Etiquetas: EntityFrameworkCore Hangfire ASP.NET Core ABP SQL Server

Publicado el 6-6 17:15