有没有办法在 Rails 开发日志中找到哪一行代码生成了 MySQL 语句?
为了进行一些性能优化,我想找出我的应用程序的哪个部分正在创建哪些 MySQL 查询。当我查看我的日志时,我看到在我所做的每个 Web 请求上都有数百个查询闪烁,我需要找出它们来自哪里。
我正在考虑在日志输出中添加一些变量,例如____FILE____
和。____LINE____
那可能吗?
有没有办法在 Rails 开发日志中找到哪一行代码生成了 MySQL 语句?
为了进行一些性能优化,我想找出我的应用程序的哪个部分正在创建哪些 MySQL 查询。当我查看我的日志时,我看到在我所做的每个 Web 请求上都有数百个查询闪烁,我需要找出它们来自哪里。
我正在考虑在日志输出中添加一些变量,例如____FILE____
和。____LINE____
那可能吗?
https://github.com/lightyear/sql-logging为您提供每个 SQL 查询的回溯以及一堆有用的统计信息。
你有几个选择。这些选项都不会以与获取 Ruby 错误回溯相同的方式为您提供回溯,但它们将为您提供所需的工具和信息,以准确追踪 SQL 查询的来源。
您的典型 Rails 日志条目将如下所示:
Started GET "/login" for 127.0.0.1 at Thu Sep 27 18:59:08 -0500 2012
Processing by PublicController#index as HTML
(40.9ms) SELECT COUNT(*) FROM "studies"
(49.6ms) SELECT COUNT(DISTINCT "activities"."whodiddit") FROM "activities"
(35.3ms) SELECT COUNT(*) FROM "involvements"
我猜这就是您的数百个 SQL 查询发生的地方?
Rendered partials/_faq.haml (6.1ms)
Rendered public/index.html.haml within layouts/public (114.3ms)
Completed 200 OK in 595ms (Views: 276.7ms | ActiveRecord: 151.6ms)
所以,在顶部你有 HTTP 动词GET
和路由(/login
在我的例子中),以及它来自的主机。之后,Rails 会告诉您哪个控制器+动作被触发。
注意:如果您看到以该开头的行,则Rendered...
表示您的视图正在渲染。渲染后出现的任何 SQL 查询都表明 SQL 查询正在您的视图中触发(例如,在您的控制器之外)。只是一件小事要考虑。根据视图调用的代码,触发 SQL 查询的实际行可能隐藏在助手、模型或视图代码调用的其他任何地方。
Processing by PublicController#index as HTML
最后的as HTML
位告诉您请求的格式,因此可能会在响应中使用哪种视图/格式。
因此,这基本上告诉您,SQL 查询是作为 中的index
操作的一部分触发的PublicController
,或者作为触发该操作的结果该控制器呈现的视图之一。
如果要解析的内容太多,您可以使用debugger
命令在各个点停止输出,并允许您检查正在发生的事情。更多关于调试器的信息。
您可以使用Rails.logger.info "My info message"
or Rails.logger.error "My error message"
(取决于您希望它在默认日志还是错误日志等中)直接在您的应用程序日志中输出内容。