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

时间:2013-10-19 19:25:28

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

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

或者,如果不容易发生什么困难呢?

5 个答案:

答案 0 :(得分:7)

ADO.NET Data Tracing会为你效劳吗?它插入ETW,您可以从中粘贴当前的日志记录系统。虽然看起来并不多见。

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

另一种方法是尝试修改ADO.Net代码的相关部分并插入日志记录。像AfterThought https://github.com/vc3/Afterthought这样的工具可能是一种选择,虽然我认为除了最受控制的环境之外,其他所有环境都有问题,特别是白名单,AV,更新,版本控制等。

答案 4 :(得分:-3)

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

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