Entity Framework Core日志

我们经常需要在EF Core中记录SQL并更改跟踪信息以进行调试。
EF Core日志记录自动与.NET Core的日志记录机制集成。因此,在隐含使用EF Core的日志记录之前,了解有关.NET Core日志记录的基础知识。
Entity Framework Core与.NET Core日志记录集成在一起,以记录SQL并将跟踪信息更改为各种输出目标。首先,安装您选择的日志记录提供程序的Nuget程序包,然后将DbContext绑定到ILoggerFactory。
让我们安装日志记录提供程序的NuGet软件包。在这里,我们将在控制台上显示日志,因此从NuGet程序包管理器安装Microsoft.Extensions.Logging.Console NuGet程序包,或在程序包管理器控制台中执行以下命令:

Install-Package Microsoft.Extensions.Logging.Console

下图说明了DbContext如何与日志记录API和控制台日志记录提供程序一起使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afUjJAU3-1581165281344)(d:\note\efcore\pic\27.png)]

在安装控制台记录器提供程序之后,您需要创建LoggerFactory的静态/单个实例,然后将其与DbContext绑定,如下所示。

public class SchoolContext : DbContext
{//static LoggerFactory objectpublic 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; }
}

在上面的示例中,我们创建了LoggerFactory类的对象,并将其分配给ILoggerFactory类型的静态变量。然后,我们在OnConfiguring()方法的optionsBuilder.UseLoggerFactory()方法中传递了此对象。这将使DbContext与loggerFactory对象共享信息,该对象又将在控制台上显示所有日志记录信息。
默认情况下,EF Core将不记录敏感数据,例如过滤器参数值。因此,调用EnableSensitiveDataLogging()记录敏感数据。
注意:
EF团队建议在应用程序生存期内,将同一个logger工厂对象与DbContext类的所有实例一起使用。否则,可能会导致内存泄漏和性能下降。您还可以创建一个单独的工厂类,为您提供LoggerFactory类的单例对象,以与DbContext一起使用。
让我们详细了解上面的示例。
首先,我们创建了LoggerFactory类的对象,并将其分配给ILoggerFactory类型的静态变量,如下所示。

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

LoggerFactory可以包含一个或多个日志记录提供程序,可用于同时记录到多个介质。 LoggerFactory的构造函数接受一系列不同的记录器提供程序对象作为new [] {}。我们希望在控制台上显示日志,因此创建控制台记录器提供程序ConsoleLoggerProvider的对象。
ConsoleLoggerProvider有四个构造函数。使用允许lambda表达式(Func <>)进行日志过滤的方法,并使用includeScope布尔值,如下所示。

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

在这里,我们不想过滤任何信息,因此lambda表达式将始终返回true (_, __) => true.

创建ILoggerFactory对象之后,使用DbContextOptionsBuilder在OnConfiguring()方法中将DbContext与ILoggerFactory绑定在一起。

optionsBuilder.UseLoggerFactory(loggerFactory)

因此,我们将DbContext与包括控制台记录器提供程序的LoggerFactory绑定在一起。现在,每当DbContext实例执行任何操作时,我们都可以在控制台上看到所有日志。
考虑以下示例。

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

上面的示例将在控制台上显示以下日志:

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.

如您所见,它记录了所有信息。

过滤日志

在上面的示例中,DbContext在保存实体时记录了所有信息。有时您不想记录所有信息并过滤一些不需要的日志。在EF Core中,您可以通过指定记录器类别和日志级别来过滤日志。

日志分类

EF Core 2.x包含DbLoggerCategory类,以使用其Name属性获取Entity Framework Core记录器类别。下表列出了不同的记录器类别。

日志类别类 描述
Database.Command 命令执行的记录器类别,包括发送到数据库的SQL。
Database.Connection 数据库连接操作的记录器类别。
Database.Transaction 数据库事务的记录器类别。
Infrastructure EF基础结构的其他消息的记录器类别。
Migration 迁移的记录器类别。
Model 用于模型构建和元数据的记录器类别。
Query 查询的记录器类别(不包括生成的SQL)。
Scaffolding 脚手架和逆向工程的记录仪类别。
Update DbContext.SaveChanges()消息的记录器类别。

记录SQL查询

要仅记录SQL查询,请在ConsoleLoggerProvider的构造函数的lambda表达式中指定DbLoggerCategory.Database.Command类别和LogLevel.Information,如下所示。

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

或者,默认情况下,只需在LoggerFactory上调用AddConsole()方法即可记录SQL查询。

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

现在,这将记录以下查询信息,这些查询信息使用DbContext保存一个实体。

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();

Entity Framework Core系列教程-25-Entity Framework Core日志相关推荐

  1. ASP.NET Core 和 EF Core系列教程——CRUD

    ASP.NET Core 和 EF Core系列教程--CRUD (2 / 10) CRUD 为创建.读取.更新.删除的英文首字母的缩写 作者:Tom Dykstra和Rick Anderson Co ...

  2. STM32 基础系列教程 25 - USB_HID_mouse

    前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开 ...

  3. Entity Framework Core系列教程-3为现有数据库生成实体模型

    在Entity Framework Core中为现有数据库创建模型 在这里,您将学习如何在Entity Framework Core中为现有数据库创建上下文和实体类.为现有数据库创建实体和上下文类称为 ...

  4. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  5. Entity Framework Core系列教程-23-原生SQL查询

    在Entity Framework Core中执行原生SQL查询 Entity Framework Core提供了DbSet.FromSql()方法来对基础数据库执行原始SQL查询,并将结果作为实体对 ...

  6. cubemx 读卡器_STM32CubeMX系列教程25:USB Device

    本章不打算详细讲解USB的协议,本章只是介绍如何通过STM32CubeMX软件生成应用程序. 在看本教程之前建议先看ST官方关于USB的培训视频,示例 一.USB简介stm32F746系列芯片有USB ...

  7. Auto.js Pro安卓免ROOT引流脚本开发系列教程25网易公开课(3)-取用户性别

    APP_取用户性别() 返回值类型 说明 整数型 返回值 性别 0 女 1 男 2 无 等待个人资料页出现(判断是否在个人资料页) 判断性别节点是否存在 在性别节点范围内取色 根据色值判断性别 开发文 ...

  8. microbit c语言编程软件,Micro:bit系列教程25:自定义Micro:bit软件包

    cpp代码:/** * 使用此文件来定义自定义函数和图形块. * 想了解更详细的信息,请前往 https://makecode.microbit.org/blocks/custom */ /** * ...

  9. Hyper-V 2016 系列教程25 配置NFS 存储服务器

    一般企业在虚拟化服务器上线后,会有一部分的物理服务器淘汰下来,而这些服务器有的性能虽然不是最好的,但是硬盘却是专业的RAID级别的,甚至还没有过厂家的保修期,所以如果能将这些资源充分利用起来,也能为企 ...

最新文章

  1. 死猪脑”能复活吗?---评美国耶鲁大学医学院实验研究
  2. Python的系统管理_12_rrdtool
  3. ubuntu python_Ubuntu配置VSCode的python和C++环境
  4. (33)FPGA面试技能提升篇(MIPI接口)
  5. 如何正确使用日志Log
  6. Java定义字符串(2种方式)
  7. 验证 decimal 和 数字
  8. Java for LeetCode 036 Valid Sudoku
  9. 阿里开源代码质量检测工具!
  10. goldengate 检查点的理解
  11. 购买计算机设备计入什么科目,企业购买设备计入什么会计科目?附会计分录
  12. 学术-几何:黑森错觉
  13. 【模拟IC】时钟馈通效应减小及仿真验证
  14. 解决Kubernetes的flannel pod出现Init:RunContainerError问题
  15. Photoshop几何3D立体头像制作教程
  16. Hyperf 热更新Watcher
  17. GOPS 2021 上海站 《钟炯恩 大数据云原生运维平台实践》
  18. if条件句和switch条件句
  19. 工作篇 之 高仿微信双击消息弹出可自由复制
  20. Windows系统设置宽带连接开机自动拨号的方法

热门文章

  1. clipboard.js 实现动态获取内容并复制到剪切板
  2. 学习PHP——高级(总)
  3. linux坏道检测修复脚本,Linux 磁盘坏道检测和修复
  4. JAVA父类强转子类
  5. 省钱版----查找 IoT 设备TTL线序__未完待续
  6. 图片公式提取至文档word
  7. Excel VBA 字典/数组 示例
  8. HTML5+CSS3小实例:篮球弹跳动画
  9. ftp下载工具绿色版,网络上难找的绿色版ftp下载工具
  10. MSSQL 注入鄙见