分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子

image

前言

EF 开发效率确实很高也很便捷,但当它发生错误时,也挺让人头疼的,为什么?因为 EF 就像是一个黑盒子,一切全被封装起来,出错的时候很难定位原因,如果能够知道并打印 EF 生成的 SQL 语句,对于定位 EF 错误,就很有帮助。

程序员的才智是无限的,虽然 EF 有这个那个的问题,但程序员却总比这些问题多一个办法。

下面分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子。

Step By Step 步骤

  1. 创建自定义监听器类,拦截 EF 的命令执行事件(留意注释

    /// <summary>
    /// 监听并写 EF 生成的 SQL 到日志
    /// </summary>
    public class EFIntercepterLogging : IDbCommandInterceptor
    {/// <summary>/// 实现接口的 NonQueryExecuting 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext){LogWhenExecuting(command, interceptionContext);}/// <summary>/// 实现接口的 NonQueryExecuted 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext){LogIfError(command, interceptionContext);}/// <summary>/// 实现接口的 ReaderExecuting 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext){LogWhenExecuting(command, interceptionContext);}/// <summary>/// 实现接口的 ReaderExecuted 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext){LogIfError(command, interceptionContext);}/// <summary>/// 实现接口的 ScalarExecuting 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext){LogWhenExecuting(command, interceptionContext);}/// <summary>/// 实现接口的 ScalarExecuted 方法/// </summary>/// <param name="command"></param>/// <param name="interceptionContext"></param>public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext){LogIfError(command, interceptionContext);}/// <summary>/// 写 EF 执行中的 SQL 日志,Debug 级别,用在 Executing 方法/// </summary>/// <typeparam name="TResult"></typeparam>/// <param name="command"></param>/// <param name="interceptionContext"></param>private void LogWhenExecuting<TResult>(DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext){Logger.DebugFormat("Executing the following SQL: [{0}]", command.CommandText);}/// <summary>/// 出现异常时写日志到 Log4net/// </summary>/// <typeparam name="TResult"></typeparam>/// <param name="command"></param>/// <param name="interceptionContext"></param>private void LogIfError<TResult>(DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext){if (interceptionContext.Exception != null){var errMsg = new StringBuilder(16);errMsg.AppendLine("Error occurred when executing the following SQL: ");errMsg.AppendLine(command.CommandText);foreach (DbParameter param in command.Parameters){errMsg.AppendLine($"ParameterName:[{param.ParameterName}] -- DbType:[{param.DbType}] -- Value:[{param.Value}]");}Logger.Error(errMsg, interceptionContext.Exception);}}
    }
    
  2. 在 Global.asax 中的 Application_Start 方法注册监听器

    protected void Application_Start()
    {AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);//autofac注册AutofacConfig.RegisterConfig();//注册 EF log 监听器DbInterception.Add(new EFIntercepterLogging());
    }
    
  3. 这样就实现了监听器拦截 EF 消息写日志的功能,当运行程序执行 EF 语句时,就会自动将 EF 生成的 SQL 写到日志文件中

总结

通过实现自定义监听器类并注册监听器,可以跟踪和记录 EF 的操作和事件,在开发过程中更好地了解和调试 EF 的行为,不失为排查 EF 问题和优化 EF 性能的一个好方法。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/374895.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML-各种图

什么是类图 定义系统中的类&#xff0c;描述类的内部结构&#xff08;属性、方法等&#xff09;&#xff0c;表示类之间的关系&#xff08;泛化、实现、依赖、关联、聚合、组合&#xff09;。 UML表示类图 上图中左侧图形是一个常见的类图&#xff0c; 类名&#xff1a;在顶…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

零基础做项目---五子棋对战---day02

用户模块 完成注册登录&#xff0c;以及用户分数管理~使用数据库来保存上述用户信息. 使用 MyBatis来连接并操作数据库了 主要步骤: 1.修改 Spring的配置文件,使数据库可以被连接上. 2.创建实体类&#xff0c;用户, User 3.创建Mapper接口~ 4.实现MyBatis 的相关xml配置…

初学SpringMVC之接收请求参数及数据回显

pom.xml 文件导入 lombok 的依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示这是一个控制器 RequestParam 表示从前端接收…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度&#xff0c;这家来自英国的品牌&#xff0c;有着鲜明的黑金设计色彩&#xff0c;以及低调奢华的质感&#xff0c;当然最重要的是&#xff0c;欧尼士的音质表现非常出色&#xff0c;因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

前端-Cookie篇

文章目录 一、由来什么是Cookie&#xff1f;特点Cookie的类型 二、原理三、Cookie生成机制客户端设置案例 四、属性五、缺陷最后分享一段自己工作中封装的一些关于cookie的公众方法✒️总结 前端Cookie是Web开发中非常重要的一部分&#xff0c;它是服务器发送到用户浏览器并保存…

大吉大利杯_RE

A-Maze-In 一道比较新颖的 maze 题吧&#xff0c; 地图长度是 256 32 * 8 &#xff1f; 不知道了 0.0 难崩&#xff0c;看了一下 wp 说map长度什么的都有&#xff0c;应该就是 16 * 16的 看了一圈&#xff0c;感觉还是要把 DFS&#xff0c;BFS 算法学一下&#xff0c;直接跑…

视频太大怎么压缩变小?这几种压缩方法值得收藏!

视频太大怎么压缩变小&#xff1f;在数字化浪潮汹涌的时代&#xff0c;处理大型视频文件已不再仅仅是存储空间的挑战&#xff0c;我们身处于数据洪流之中&#xff0c;数据的安全与隐私的保护已然成为了我们不得不面对的重大议题&#xff0c;特别是随着视频内容的井喷式增长及其…

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言&#xff08;DDL&#xff09;2. 数据操作语言&#xff08;DML&#xff09;3. 数据查询语言&#xff08;DQL&#xff09;4. 数据控制语言&#xff08;DCL&#xff09;总结 在 MySQL 数据库管理系统中&#xff0c;SQL 语句可以根据其功能分为不同的类别&…

【thingsbord源码编译】 显示node内存不足

编译thingsbord显示报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory问题原因分析 重新安装java版本 编译通过

【Vue3】使用vite创建vue项目

一、安装Nodejs 参考文章https://blog.csdn.net/DX390609/article/details/140305585?spm1001.2014.3001.5502 二、创建项目 在要创建的目录下打开命令行输入&#xff1a; npm create vuelatestvue项目创建成功&#xff1a; 三、安装vue插件 vscode打开项目文件夹&…

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…

C++:组合和继承的区别

组合介绍以及与继承对比 什么是组合 (1)composition&#xff0c;组合&#xff0c;就是在一个class内使用其他多个class的对象作为成员 (2)用class tree做案例讲解 (3)组合也是一种代码复用方法&#xff0c;本质也是结构体包含 #include <iostream> #include <vector…

曹操的五色棋布阵 - 工厂方法模式

定场诗 “兵无常势&#xff0c;水无常形&#xff0c;能因敌变化而取胜者&#xff0c;谓之神。” 在三国的战场上&#xff0c;兵法如棋&#xff0c;布阵如画。曹操的五色棋布阵&#xff0c;不正是今日软件设计中工厂方法模式的绝妙写照吗&#xff1f;让我们从这个神奇的布阵之…

srs直播内网拉流带宽飙升问题记录

问题背景 srs部署在云服务器上&#xff0c;32核cpu&#xff0c;64G内存&#xff0c;带宽300M. 客户端从srs拉流&#xff0c;发现外网客户端拉流&#xff0c;cpu和带宽都正常。然而内网客户端拉流&#xff0c;拉流人数超过5人以上&#xff0c;带宽就会迅速飙升。 排查 用srs…

【爬虫】爬虫基础

目录 一、Http响应与请求1、Http请求2、Http响应3、状态码 二、Requests库1、发起GET请求2、发起POST请求3、处理请求头 三、BeautifulSoup库1、解析HTML文档2、查找和提取数据Ⅰ、查找单个元素Ⅱ、查找所有元素Ⅲ、使用CSS选择器Ⅳ、获取元素属性 四、爬取豆瓣电影榜 一、Http…

Desktop docker 部署 WordPress

Desktop Docker 部署 WordPress 之前都是在Linux里面玩的&#xff0c;今天看到别人在windwos下安装docker&#xff0c;一时兴起装了一个试试&#xff0c;效果一般&#xff0c;很吃硬盘空间和内存。 首先在docker官方下载桌面版&#xff0c;安装下一步一直到完成。 安装完docke…

一招杜绝 | 网站被劫持强制植入广告的问题

在我们日常上网过程中&#xff0c;经常会遇到打开一个网页&#xff0c;网页都还没有显示出来&#xff0c;一堆广告就弹出来的现象。或者网页刚刚打开&#xff0c;没几分钟 就会弹出来某游戏广告&#xff0c;注册领豪华坐骑等等的小广告。这些广告不仅仅会让我们对网站的真实性产…

强烈推荐!!李沐老师《动手学深度学习》最新Pytorch版!

动手学深度学习(PyTorch版)》是由李沐、Aston Zhang和孔德威共同编写的教材&#xff0c;专为深度学习初学者和实践者设计。本书使用PyTorch作为主要的深度学习框架&#xff0c;全面系统地介绍了深度学习的基本理论、常见模型和实际应用技巧。 书中内容包括深度学习的基础知识、…

逻辑回归(纯理论)

1.什么是逻辑回归&#xff1f; 逻辑回归是一种常用的统计学习方法&#xff0c;主要用于解决分类问题。尽管名字中包含"回归"&#xff0c;但它实际上是一种分类算法 2.为什么机器学习需要使用逻辑回归 1.二元分类 这是逻辑回归最基本和常见的用途。它可以预测某个事…