【问题标题】:How to capture all SQL sent over Ado.Net如何捕获通过 Ado.Net 发送的所有 SQL
【发布时间】:2013-10-19 19:25:28
【问题描述】:

我有一个同时使用 Entity Framework 和 Dapper 的应用程序。我想提供一个自定义记录器来注销通过 ado.net 连接发出的任何 sql。这样做的最佳方法是什么?

或者,如果不容易做到,具体有哪些困难?

【问题讨论】:

  • 您使用的是哪个版本的实体框架?根据时间尺度和升级路径的难易程度,Entity Framework 6 确实支持 DbCommand 拦截:entityframework.codeplex.com/wikipage?title=Interception
  • @dannykay1710 哦,太棒了。由于某种原因,这个项目被锁定在 EF4 中,没有人能够向我解释清楚,但我也将在一周内关闭它,所以我可以在下一个项目中使用它。

标签: c# entity-framework logging ado.net dapper


【解决方案1】:

ADO.NET Data Tracing 适合你吗?它插入 ETW,您可以从中粘合当前的日志记录系统。不过似乎不是很独立。

【讨论】:

    【解决方案2】:

    由同一团队编写的 Miniprofiler 可与 dapper 和 Entity Framework 一起使用 - 尽管 iirc 后者需要bit 更多的工作。这提供了记录和分析 ADO.NET 命令的能力。我们在 stackoverflow(以及整个堆栈交换网络)上全天候 24x7 使用它,因此即使在规模上也能正常工作。

    【讨论】:

    • 如何将其连接到自定义记录器?我花了一些时间浏览他们的源代码并复制该功能似乎很重要
    【解决方案3】:

    Glimpse 工具提供了跟踪 SQL 调用(以及大量其他信息)的能力,并且正在由 ASP.NET 团队积极推广:http://www.asp.net/mvc/overview/performance/profile-and-debug-your-aspnet-mvc-app-with-glimpse

    【讨论】:

      【解决方案4】:

      利用SharpPcap API 并在 SQL 运行的端口上侦听客户端 IP 和 SQL 服务器 IP 之间建立的连接。然后,您可以运行正则表达式或类似的方法来提取 SQL 命令。其中大多数将以INSERTUPDATESELECTDELETEEXEC 开头。一旦你有了字符串,就调用你现有的任何记录器并根据需要记录。您可以将其作为服务、由您的应用程序启动的第二个应用程序运行,甚至可以在第二个线程上从第一个应用程序中运行。它比ADO 管道低一点,但这只是给你更多的灵活性。您可以测试并与服务器上的 SQL 分析器/SQL 跟踪接收到的流量进行比较,以验证它是否有效。

      另一种选择是尝试修改 ADO.Net 代码的相关部分并插入日志记录。 AfterThought https://github.com/vc3/Afterthought 之类的工具可能是一种选择,尽管我认为这在除了最受控制的环境之外的所有环境中都会带来麻烦,尤其是白名单、反病毒、更新、版本控制等。

      【讨论】:

      • 为了清楚起见,您是在说 Ado.Net 中没有任何内容允许这样做?
      • 我认为这个(.ToTraceString 方法)是您可能得到的最接近的msdn.microsoft.com/en-us/magazine/gg490349.aspx(仅注意查询的子集),但不,我不认为有一个完美的适合您想要的东西。 SqlCommand 几乎没有您可以挂钩的事件,也没有任何 ADO.Net 支持记录器的注入。文章底部的 EFTracingProvider 看起来很有希望,但我不能保证它也没有足够的信息说它很合适,因为你听起来想要一些你可以打开的东西(?)。
      • 这可能也有帮助,使用 log4net 这是一个奖励。 fknet.wordpress.com/2011/02/28/entity-framework-logging 但这又是实体框架,问题是所有通过 ADO.Net 的流量,如果您的应用程序和/或 EF 之外的所有流量,请查看以前的答案。
      【解决方案5】:

      您可以使用 log4net:http://www.nuget.org/packages/log4net/

      我一直在几个大项目中使用它。非常有用,因为您可以指定要记录的内容/位置。
      既然你想记录 SQL 语句,你可以在你的数据访问层放一个日志。

      【讨论】:

      • 他正在使用生成 SQL 的框架,他们想要一些能够捕获正在生成的 sql 的东西。
      • 是的,我已经在使用 log4net,问题是如何将它挂接到 ado.net 管道中
      猜你喜欢
      • 2019-08-27
      • 2021-11-09
      • 1970-01-01
      • 2020-12-26
      • 2012-01-02
      • 2012-05-20
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多