繁体   English   中英

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

[英]How to capture all SQL sent over Ado.Net

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

或者,如果不容易实现,那么困难究竟是什么?

ADO.NET 数据跟踪对您有用吗? 它插入到 ETW 中,您可以从中连接当前的日志记录系统。 虽然看起来不是很独立。

Miniprofiler,这是由同一个团队写的,可工作在短小精悍和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-glipse

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM