Entity Framework Core系列教程-25-Entity Framework Core日志

2023-11-04

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 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; }
}

在上面的示例中,我们创建了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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core系列教程-25-Entity Framework Core日志 的相关文章

  • 最牛的人脸检测算法

    深大于老师的libfacedetection检测算法快速高效 准确率相当高 世界排名第五 最小可检测人脸12 12像素 关键是前两天开源了 于是我简单的看了一下 是自己用c 手敲的cnn代码 真心佩服 该代码可以在windows linux
  • pycharm安装beautifulsoup出错

    尝试一 将虚拟环境的解释器改成安装python真实路径的解释器 步骤 setting gt project interpreter gt show all gt gt system interpreter 尝试二 Python3的选择bs4
  • 休眠唤醒(suspend/resume)时长问题分析思路

    1 echo 1 gt sys power pm print times 打开suspend resume耗时开关 如下 可以看到系统休眠时各阶段驱动模块的耗时打印 可用来帮助分析排查休眠耗时长的问题 267 398855 lt 1 gt
  • windows系统c++多线程开发

    线程的一些基本概念 一 线程的基本概念 基本概念 线程 即轻量级进程 LWP LightWeight Process 是程序执行流的最小单元 一个标准的线程由线程ID 当前指令指针 PC 寄存器集合和堆栈组成 线程是进程中的一个实体 是被系
  • 50Hz双T陷波滤波器(带阻滤波器)

    一 双T陷波滤波器 针对其中50Hz仿真计算 https www docin com p 1945752171 html 双T型陷波滤波器 Ivan 的专栏 CSDN博客 t型滤波器 https blog csdn net stephani
  • C语言学习:运算符和表达式

    算数运算符 自增 自减运算符 作用是让变量的值加1减1 i 在使用i之前加一 i 在使用i之后加一 这种运算符只能用于变量 常常用在循环语句哪里 也用于指针变量 是指针指向下一个地址 算数优先级 一个数两边都有运算符 那么先考虑优先级 如果

随机推荐

  • 改善你的jQuery的25个步骤 千倍级效率提升

    1 从Google Code加载jQueryGoogle Code上已经托管了多种JavaScript类库 从Google Code上加载jQuery比直接从你的服务器加载更有优势 它节省了你服务器上的带宽 能够很快的从Google的内容分
  • 喜大普奔!70k Star 《Java面试突击手册》PDF版本开放下载啦!

    前段时间我的朋友 Guide 哥终于把PDF版本的 Java面试突击手册 搞定 废话不多说 直接上目录 这份文档是 JavaGuide 这个项目所有和 Java 面试相关的文章的集合 内容涵盖Java基础 计算机网络 数据库 Spring等
  • Cookie基本使用

    开发工具与关键技术 IDEA 撰写时间 2022 10 8 发送Cookie 创建Cookie对象 设置数据 Cookie cookie new Cookie String key String value 2 发送Cookie到客户端 使
  • spring使用内存数据库(h2)快速开发

    目录 什么是内存数据库 内存数据库可以解决什么问题 有哪些内存数据库 内存数据库这么多 到底选哪个好 可以参考对比 代码下载 https gitee com hong99 spring issues I1N1DF 代码实现 代码下载 htt
  • 移动端项目常见适配

    目录 1 视口设置 2 解决click事件0 3秒延迟问题 3 解决不同机型border显示不一样的问题 移动端rem适配 1 视口设置 如果是vue项目 视口设置一般在根目录或public下的index html 设置为理想视口 不允许用
  • 深度学习中训练时候遇到这些错误 RuntimeError、IndexError、ValueError如何解决

    深度学习训练中遇到一些bug torch版 RuntimeError 类型一 RuntimeError Input type torch cuda FloatTensor and weight type torch FloatTensor
  • 华为机试:最长方连续方波信号

    题目来源 最长方连续方波信号 题目描述 输入一串方波信号 求取最长的完全连续交替方波信号 并将其输出 如果有相同长度的交替方波信号 输出任一即可 方波信号高位用1标识 低位用0标识 如图 说明 1 一个完整的信号一定以0开始然后以0结尾 即
  • 我的全栈之路-C语言基础之C语言概述与开发环境搭建

    我的全栈之路 C语言基础之C语言概述与开发环境搭建 我的全栈之路 1 1 信息技术发展趋势 1 2 浅谈计算机系统架构 1 2 1 计算机系统架构概述 1 2 2 计算机硬件系统 1 2 2 计算机软件系统 1 3 程序和指令 1 4 编程
  • 惯导系列(一):STM232 IIC读取MPU数据

    前言 消失了几天的我在哪 对 没错 就在实验室默默的调试代码 折磨我几天的MPU终于弄好了 虽然只是弄好一半 但是也是值得令人开心的 本节介绍 一 IIC通讯 1 1 IIC通讯简介 1 2 模拟IIC 1 3 mpu外设 二 实现 2 1
  • Windows10如何添加开机启动项

    在日常生活中 偶尔要求其中的软件在开机时便能自动启动 比如MySQL一般被设置为自启动项 今天将为大家介绍window10中如何添加开机启动项 操作过程 1 按下win R调出运行窗口 并输入 shell startup 即可进入开机启动文
  • 事务与异步脏数据问题

    1 事务未提交 异步获取不到数据 package com spring pro service impl import java util concurrent CompletableFuture import java util conc
  • QT基础:遍历QFormLayout列表布局器中的控件,并链接槽函数进行操作

    QFormLayout 是一个列表布局器 每一行的序号是从0开始的 类似于数组的下标 每一行有两个元素 左边的元素叫标签 Label 右边的元素叫字段 Field 这里是一个QFormLayout简单的布局演示 QFormLayout 列表
  • Hive的Join操作、Hive解决数据倾斜问题、Hive优化、Hive的分桶表、JDBC、体系结构、工程流程

    Hive的Join操作 order表数据 1 20180710 P001 20 2 20180710 P002 14 3 20180710 P001 35 4 20180710 P002 40 5 20180710 P001 10 6 20
  • 解决文本框刷新后之前输入的值还存在,没有清空的问题

    有过表单设计经验的朋友肯定知道 当我们在浏览器中输入表单信息的时候 往往input文本输入框会记录下之前提交表单的信息 以后每次只要双击 input文本输入框就会出现之前输入的文本 这样有时会觉得比较方便 但有时也会暴露用户的隐藏数据 所以
  • 如何在Windows打造出你的Linux开发环境

    在这篇文章里 我将向大家分享一些软件安装和环境设置方法 这是我最近的实践收获 并对使用效果非常满意 我不能永远待在Linux上开发 但我非常喜欢Linux终端和Linux环境 在开发一些开源软件时 Linux会让我感觉所有的事情变得更容易
  • uniapp的入栈出栈

    uniapp管理页面是利用栈的形式管理 因此多次入栈不出栈会造成页面的卡顿 入栈出栈的顺序不对 会在返回的时候不能回到对应页面 都是因为出栈入栈的时机不对造成的 一个页面会在什么时候进行入栈 又在什么时候出栈 他们分别触发了什么生命周期 这
  • Latex关键词(key words)的基本格式代码(加粗、斜体、空白行+首段空两格)

    Latex关键词 key words 的基本格式指令 加粗 斜体 空白行 首段空两格 在用英文写report或reference时keywords是必不可少的 Abstract和keywords这种简单的指令直接套用固定的格式模板就行 根据
  • docker构建国内镜像服务

    在国内想要下载镜像比较困难 因此很多公司都构建自己的私有仓库 如何搭建私有仓库 请参考 docker私有仓库从无到有 然而即使私有仓库服务构建完成 但是里面没有镜像 一样很苦恼 今天介绍一下如何利用国内云服务商提供的镜像加速器 来快速下载镜
  • Python中pymssql 的使用操作

    在python3 x中 可以使用pymysql来MySQL数据库的连接 并实现数据库的各种操作 本次博客主要介绍了pymysql的安装和使用方法 PyMySQL的安装 一 windows上的安装方法 在python3 6中 自带pip3 所
  • Entity Framework Core系列教程-25-Entity Framework Core日志

    Entity Framework Core日志 我们经常需要在EF Core中记录SQL并更改跟踪信息以进行调试 EF Core日志记录自动与 NET Core的日志记录机制集成 因此 在隐含使用EF Core的日志记录之前 了解有关 NE