有没有办法在Rails开发日志中找到哪一行代码生成了MySQL语句?
为了进行一些性能优化,我想找到我的应用程序的哪个部分正在创建哪些MySQL查询。当我查看我的日志时,我看到每次网络请求时都会出现问题,我需要找出它们的来源。
我正在考虑在日志输出中添加____FILE____
和____LINE____
等变量。
这可能吗?
答案 0 :(得分:4)
https://github.com/lightyear/sql-logging为您提供每个SQL查询的回溯以及一堆有用的统计信息。
答案 1 :(得分:1)
您有几个选择。这些选项中的任何一个都不会像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
命令停止各个点的输出,并允许您检查正在发生的事情。有关debugger here。
您可以使用Rails.logger.info "My info message"
或Rails.logger.error "My error message"
(取决于您是否希望将其置于默认或错误日志中等)直接在应用日志中输出内容。