从SQL查询回溯到应用程序代码?

有没有办法找到哪一行代码在Rails开发日志中生成MySQL语句?

为了进行一些性能优化,我想找到我的应用程序的哪个部分正在创建哪些MySQL查询。 当我查看我的日志时,我看到每个网页请求都会闪烁的问题,我需要找出它们的来源。

我正在考虑在日志输出中添加一些变量,如____FILE________LINE____

那可能吗?

你有几个选择。 这些选项中的任何一个都不会像使Ruby返回错误那样完全为您提供回溯,但是它们将为您提供所需的工具和信息,以准确跟踪SQL查询的来源。

  1. 典型的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查询是作为PublicController index操作的一部分触发的,还是由于触发此操作而导致该控制器呈现的视图之一。

  2. 如果解析太多,则使用debugger命令在各个点停止输出,并允许您检查正在发生的事情。 更多关于调试器的信息 。

  3. 您可以使用Rails.logger.info "My info message"Rails.logger.error "My error message" (取决于您是否希望它在默认或错误日志Rails.logger.error "My error message" )在您的应用程序日志中直接输出内容。