Uso de Microsoft.Extensions.Logging en EF Core

Microsoft.Extensions.Logging es un mecanismo de registro extensible con proveedores de complementos para muchos sistemas de registro comunes. Los complementos proporcionados por Microsoft (por ejemplo , Microsoft.Extensions.Logging.Console) y complementos de terceros (por ejemplo , Serilog.Extensions.Logging) están disponibles como paquetes NuGet.

Entity Framework Core (EF Core) se integra completamente con Microsoft.Extensions.Logging. Sin embargo, considere la posibilidad de usar un registro sencillo para una manera más sencilla de registrar, especialmente para las aplicaciones que no usan la inserción de dependencias.

Aplicaciones de ASP.NET Core

Microsoft.Extensions.Loggingse usa de forma predeterminada en ASP.NET Core aplicaciones. Al llamar AddDbContext a AddDbContextPool o hacer que EF Core use automáticamente la configuración de registro configurada a través del mecanismo de ASP.NET normal.

Otros tipos de aplicación

Otros tipos de aplicación pueden usar GenericHost para obtener los mismos patrones de inserción de dependencias que se usan en ASP.NET Core. AddDbContexto AddDbContextPool se puede usar igual que en las aplicaciones de ASP.NET Core.

Microsoft.Extensions.Logging también se puede usar para aplicaciones que no usan la inserción de dependencias, aunque el registro simple puede ser más fácil de configurar.

Microsoft.Extensions.Loggingrequiere la creación de .LoggerFactory Esta factoría debe almacenarse como una instancia estática o global en algún lugar y usarse cada vez que se crea un DbContext. Por ejemplo, es habitual almacenar el generador de registradores como una propiedad estática en DbContext.

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

Esta instancia singleton/global debe registrarse con EF Core en .DbContextOptionsBuilder Por ejemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory)
        .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True");

Obtención de mensajes detallados

Sugerencia

Se sigue llamando a OnConfiguring cuando se usa AddDbContext o se pasa una instancia de DbContextOptions al constructor DbContext. Esto hace que sea el lugar ideal para aplicar la configuración de contexto independientemente de cómo se construye DbContext.

Información confidencial

De forma predeterminada, EF Core no incluirá los valores de ningún dato en los mensajes de excepción. Esto se debe a que estos datos pueden ser confidenciales y podrían revelarse en uso de producción si no se controla una excepción.

Sin embargo, conocer los valores de datos, especialmente para las claves, puede resultar muy útil al depurar. Esto se puede habilitar en EF Core llamando a EnableSensitiveDataLogging(). Por ejemplo:

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

Excepciones de consulta detalladas

Por motivos de rendimiento, EF Core no encapsula cada llamada para leer un valor del proveedor de base de datos en un bloque try-catch. Sin embargo, esto a veces da lugar a excepciones difíciles de diagnosticar, especialmente cuando la base de datos devuelve un valor NULL cuando el modelo no lo permite.

La activación EnableDetailedErrors hará que EF introduzca estos bloques try-catch y, por tanto, proporcionará errores más detallados. Por ejemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.EnableDetailedErrors();

Configuración de mensajes específicos

La API de EF Core ConfigureWarnings permite a las aplicaciones cambiar lo que sucede cuando se encuentra un evento específico. Esto se puede usar para:

  • Cambio del nivel de registro en el que se registra el evento
  • Omitir el registro del evento por completo
  • Iniciar una excepción cuando se produce el evento

Cambio del nivel de registro de un evento

A veces puede resultar útil cambiar el nivel de registro predefinido de un evento. Por ejemplo, esto se puede usar para promover dos eventos adicionales de LogLevel.Debug a LogLevel.Information:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(
            b => b.Log(
                (RelationalEventId.ConnectionOpened, LogLevel.Information),
                (RelationalEventId.ConnectionClosed, LogLevel.Information)));

Suprimir el registro de un evento

De forma similar, se puede suprimir un evento individual del registro. Esto es especialmente útil para ignorar una advertencia que se ha revisado y comprendido. Por ejemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Ignore(CoreEventId.DetachedLazyLoadingWarning));

Iniciar para un evento

Por último, EF Core se puede configurar para iniciar un evento determinado. Esto es especialmente útil para cambiar una advertencia en un error. (De hecho, este fue el propósito original del ConfigureWarnings método, por lo tanto, el nombre). Por ejemplo:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .ConfigureWarnings(b => b.Throw(RelationalEventId.QueryPossibleUnintendedUseOfEqualsWarning));

Filtrado y otra configuración

Consulte Registro en .NET para obtener instrucciones sobre el filtrado de registros y otra configuración.

Los eventos de registro de EF Core se definen en uno de los siguientes elementos:

  • CoreEventId para eventos comunes a todos los proveedores de bases de datos de EF Core
  • RelationalEventId para eventos comunes a todos los proveedores de bases de datos relacionales
  • Clase similar para eventos específicos del proveedor de base de datos actual. Por ejemplo, SqlServerEventId para el proveedor de SQL Server.

Estas definiciones contienen los identificadores de evento, el nivel de registro y la categoría de cada evento, según lo use Microsoft.Extensions.Logging.