分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
创始人
2025-01-11 09:36:57
0

image

前言

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

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

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

Step By Step 步骤

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

    ///  /// 监听并写 EF 生成的 SQL 到日志 ///  public class EFIntercepterLogging : IDbCommandInterceptor {     ///      /// 实现接口的 NonQueryExecuting 方法     ///      ///      ///      public void NonQueryExecuting(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogWhenExecuting(command, interceptionContext);     }      ///      /// 实现接口的 NonQueryExecuted 方法     ///      ///      ///      public void NonQueryExecuted(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogIfError(command, interceptionContext);     }      ///      /// 实现接口的 ReaderExecuting 方法     ///      ///      ///      public void ReaderExecuting(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogWhenExecuting(command, interceptionContext);     }      ///      /// 实现接口的 ReaderExecuted 方法     ///      ///      ///      public void ReaderExecuted(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogIfError(command, interceptionContext);     }      ///      /// 实现接口的 ScalarExecuting 方法     ///      ///      ///      public void ScalarExecuting(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogWhenExecuting(command, interceptionContext);     }      ///      /// 实现接口的 ScalarExecuted 方法     ///      ///      ///      public void ScalarExecuted(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         LogIfError(command, interceptionContext);     }      ///      /// 写 EF 执行中的 SQL 日志,Debug 级别,用在 Executing 方法     ///      ///      ///      ///      private void LogWhenExecuting(         DbCommand command,          DbCommandInterceptionContext interceptionContext)     {         Logger.DebugFormat("Executing the following SQL: [{0}]", command.CommandText);     }      ///      /// 出现异常时写日志到 Log4net     ///      ///      ///      ///      private void LogIfError(         DbCommand command,          DbCommandInterceptionContext 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 写到日志文件中

  4. 总结

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

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

    相关内容

    热门资讯

    绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
    法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
    办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
    妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
    教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
    学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
    绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
    举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
    讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
    模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...