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

时间:2012-09-27 23:04:35

标签: mysql ruby-on-rails logging performance-testing backtrace

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

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

我正在考虑在日志输出中添加____FILE________LINE____等变量。

这可能吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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查询是作为indexPublicController操作的一部分触发的,或者是控制器作为结果呈现的一个视图这个动作被触发了。

  2. 如果解析得太多,您可以使用debugger命令停止各个点的输出,并允许您检查正在发生的事情。有关debugger here

  3. 的更多信息
  4. 您可以使用Rails.logger.info "My info message"Rails.logger.error "My error message"(取决于您是否希望将其置于默认或错误日志中等)直接在应用日志中输出内容。