Entity Framework Core Series Tutorial-25-Entity Framework Core Log

Entity Framework Core logs

A menudo necesitamos registrar SQL en EF Core y cambiar la información de rastreo para la depuración.
El registro de EF Core se integra automáticamente con el mecanismo de registro de .NET Core. Por lo tanto, antes de utilizar implícitamente el registro de EF Core, comprenda los conceptos básicos sobre el registro de .NET Core.
Entity Framework Core está integrado con el registro de .NET Core para registrar SQL y cambiar la información de rastreo a varios destinos de salida. Primero, instale el paquete Nuget del proveedor de registro de su elección, y luego vincule el DbContext al ILoggerFactory.
Instalemos el paquete NuGet del proveedor de registro. Aquí, mostraremos los registros en la consola, así que instale el paquete NuGet de Microsoft.Extensions.Logging.Console desde el administrador de paquetes NuGet, o ejecute el siguiente comando en la consola del administrador de paquetes:

Install-Package Microsoft.Extensions.Logging.Console

El siguiente diagrama ilustra cómo se utiliza DbContext con la API de registro y el proveedor de registro de consola.
[Falló la transferencia de la imagen de la cadena externa, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-afUjJAU3-1581165281344) (d: \ note \ efcore \ pic \ 27.png)]

Después de instalar el proveedor del registrador de consola, debe crear una instancia estática / única de LoggerFactory y luego vincularla con DbContext como se muestra a continuación.

public class SchoolContext : DbContext
{
    //static LoggerFactory object
    public static readonly ILoggerFactory loggerFactory = new LoggerFactory(new[] {
              new ConsoleLoggerProvider((_, __) => true, true)
        });

    //or
    // public static readonly ILoggerFactory loggerFactory  = new LoggerFactory().AddConsole((_,___) => true);
    
    public SchoolContext():base()
    {

    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLoggerFactory(loggerFactory)  //tie-up DbContext with LoggerFactory object
            .EnableSensitiveDataLogging()  
            .UseSqlServer(@"Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;");
    }
        
    public DbSet<Student> Students { get; set; }
}

En el ejemplo anterior, creamos un objeto de la clase LoggerFactory y lo asignamos a una variable estática de tipo ILoggerFactory. Luego, pasamos este objeto en el método optionsBuilder.UseLoggerFactory () del método OnConfiguring (). Esto permitirá que DbContext comparta información con el objeto loggerFactory, que a su vez mostrará toda la información de registro en la consola.
De forma predeterminada, EF Core no registrará datos confidenciales, como los valores de los parámetros de filtro. Por lo tanto, llame a EnableSensitiveDataLogging () para registrar datos confidenciales.
Nota: El
equipo de EF recomienda usar el mismo objeto de fábrica del registrador con todas las instancias de la clase DbContext durante la vida útil de la aplicación. De lo contrario, puede causar pérdidas de memoria y degradación del rendimiento. También puede crear una clase de fábrica separada que le proporcione un objeto singleton de la clase LoggerFactory para usar con DbContext.
Comprendamos el ejemplo anterior en detalle.
Primero, creamos un objeto de la clase LoggerFactory y lo asignamos a una variable estática de tipo ILoggerFactory, como se muestra a continuación.

public static readonly ILoggerFactory loggerFactory = new LoggerFactory(
    new[] { new ConsoleLoggerProvider ((_, __) => true, true) }
);

LoggerFactory puede contener uno o más proveedores de registros de registro, que se pueden usar para grabar en múltiples medios al mismo tiempo. El constructor de LoggerFactory acepta una serie de diferentes objetos de proveedor de registrador como nuevo [] {}. Queremos mostrar el registro en la consola, así que cree un objeto para el proveedor del registrador de consola ConsoleLoggerProvider.
ConsoleLoggerProvider tiene cuatro constructores. Use un método que permita expresiones lambda (Func <>) para el filtrado de registros y use includeScope boolean, como se muestra a continuación.

new ConsoleLoggerProvider((_, __) => true, true)

Aquí, no queremos filtrar ninguna información, por lo que la expresión lambda siempre devolverá verdadero (_, __) => verdadero.

Después de crear el objeto ILoggerFactory, use DbContextOptionsBuilder para unir DbContext e ILoggerFactory en el método OnConfiguring ().

optionsBuilder.UseLoggerFactory(loggerFactory)

Por lo tanto, vinculamos el DbContext al LoggerFactory que incluye el proveedor del registrador de consola. Ahora, cada vez que la instancia de DbContext realiza alguna operación, podemos ver todos los registros en la consola.
Considere el siguiente ejemplo.

using (var context = new SchoolContext())
{
    var std = new Student(){ StudentName = "Steve" };
    context.Add(std);
                
    context.SaveChanges();
    Console.ReadLine();
}

El ejemplo anterior mostrará los siguientes registros en la consola:

dbug: Microsoft.EntityFrameworkCore.Infrastructure[100401]
An 'IServiceProvider' was created for internal use by Entity Framework.
info: Microsoft.EntityFrameworkCore.Infrastructure[100403]
Entity Framework Core 2.0.0-rtm-26452 initialized 'SchoolContext' using pr
ovider 'Microsoft.EntityFrameworkCore.SqlServer' with options: SensitiveDataLoggingEnabled
dbug: Microsoft.EntityFrameworkCore.Database.Connection[200000]
Opening connection to database 'SchoolDB' on server '.\SQLEXPRESS'.

dbug: Microsoft.EntityFrameworkCore.Database.Connection[200001]
Opened connection to database 'SchoolDB' on server '.\SQLEXPRESS'.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[200200]
Beginning transaction with isolation level 'ReadCommitted'.
warn: Microsoft.EntityFrameworkCore.Database.Command[100400]
Sensitive data logging is enabled. Log entries and exception messages may
include sensitive application data, this mode should only be enabled during development.
dbug: Microsoft.EntityFrameworkCore.Database.Command[200100]
Executing DbCommand [Parameters=[@p0='' (DbType = DateTime2), @p1='' (DbTy
pe = Int32), @p2='0', @p3='' (Size = 8000) (DbType = Binary), @p4='Steve' (Size = 4000), @p5='0'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [Students] ([DateOfBirth], [GradeId], [Height], [Photo], [Stud
entName], [Weight])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
SELECT [StudentID]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentID] = scope_identity();
info: Microsoft.EntityFrameworkCore.Database.Command[200101]
Executed DbCommand (68ms) [Parameters=[@p0='' (DbType = DateTime2), @p1=''
(DbType = Int32), @p2='0', @p3='' (Size = 8000) (DbType = Binary), @p4='Steve'
(Size = 4000), @p5='0'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [Students] ([DateOfBirth], [GradeId], [Height], [Photo], [Stud
entName], [Weight])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
SELECT [StudentID]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentID] = scope_identity();
dbug: Microsoft.EntityFrameworkCore.Database.Command[200300]
A data reader was disposed.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[200202]
Committing transaction.
dbug: Microsoft.EntityFrameworkCore.Database.Connection[200002]
Closing connection to database 'SchoolDB' on server '.\SQLEXPRESS'.

dbug: Microsoft.EntityFrameworkCore.Database.Connection[200003]
Closed connection to database 'SchoolDB' on server '.\SQLEXPRESS'.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[200204]
Disposing transaction.

Como puede ver, registra toda la información.

Filtrar registros

En el ejemplo anterior, DbContext registra toda la información al guardar la entidad. A veces no desea registrar toda la información y filtrar algunos registros no deseados. En EF Core, puede filtrar registros especificando la categoría y el nivel de registro.

Clasificación de registro

EF Core 2.x incluye la clase DbLoggerCategory para obtener la categoría de registrador Entity Framework Core utilizando su propiedad Name. La siguiente tabla enumera las diferentes categorías de registradores.

Categoría de registro Descripción
Database.Command El tipo de registrador que ejecuta el comando, incluido el SQL enviado a la base de datos.
Database.Connection La categoría de registrador para operaciones de conexión de base de datos.
Database.Transaction La categoría del registrador para las transacciones de la base de datos.
Infraestructura Categoría de registrador para otros mensajes en la infraestructura de EF.
Migración Categoría de registrador migrado.
Modelo La categoría de registrador utilizada para la construcción de modelos y metadatos.
Consulta La categoría de registrador de la consulta (excluyendo el SQL generado).
Andamio Tipos de grabadoras para andamios e ingeniería inversa.
Actualizar La categoría de registrador del mensaje DbContext.SaveChanges ().

Registrar consultas SQL

Para registrar solo consultas SQL, especifique la categoría DbLoggerCategory.Database.Command y LogLevel.Information en la expresión lambda del constructor ConsoleLoggerProvider, como se muestra a continuación.

public static readonly ILoggerFactory consoleLoggerFactory  
            = new LoggerFactory(new[] {
                  new ConsoleLoggerProvider((category, level) =>
                    category == DbLoggerCategory.Database.Command.Name &&
                    level == LogLevel.Information, true)
                });

O, de manera predeterminada, simplemente llame al método AddConsole () en LoggerFactory para registrar consultas SQL.

public static readonly ILoggerFactory consoleLoggerFactory
         = new LoggerFactory().AddConsole();

Ahora, esto registrará la siguiente información de consulta, que utiliza DbContext para guardar una entidad.

info: Microsoft.EntityFrameworkCore.Database.Command[200101]
Executed DbCommand (73ms) [Parameters=[@p0='' (DbType = DateTime2), @p1=''
(DbType = Int32), @p2='0', @p3='' (Size = 8000) (DbType = Binary), @p4='Steve'
(Size = 4000), @p5='0'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [Students] ([DateOfBirth], [GradeId], [Height], [Photo], [Stud
entName], [Weight])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
SELECT [StudentID]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentID] = scope_identity();
177 artículos originales publicados · 61 alabanzas · 170,000 vistas

Supongo que te gusta

Origin blog.csdn.net/xingkongtianyuzhao/article/details/104227989
Recomendado
Clasificación