如何捕获通过 Ado.Net 发送的所有 SQL

本文关键字:SQL Net 何捕获 Ado | 更新日期: 2023-09-27 18:36:15

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

或者,如果不容易实现,困难到底是什么?

如何捕获通过 Ado.Net 发送的所有 SQL

ADO.NET 数据跟踪对您有用吗? 它插入 ETW,你可以从中粘附当前的日志记录系统。不过似乎并不孤单。

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

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

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

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

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

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