6

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

为了进行一些性能优化,我想找出我的应用程序的哪个部分正在创建哪些 MySQL 查询。当我查看我的日志时,我看到在我所做的每个 Web 请求上都有数百个查询闪烁,我需要找出它们来自哪里。

我正在考虑在日志输出中添加一些变量,例如____FILE____和。____LINE____

那可能吗?

4

2 回答 2

4

https://github.com/lightyear/sql-logging为您提供每个 SQL 查询的回溯以及一堆有用的统计信息。

于 2012-10-01T15:52:57.773 回答
1

你有几个选择。这些选项都不会以与获取 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 查询是作为 中的index操作的一部分触发的PublicController,或者作为触发该操作的结果该控制器呈现的视图之一。

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

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

于 2012-09-28T00:19:53.330 回答