Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从SQL查询回溯到应用程序代码?_Mysql_Ruby On Rails_Logging_Performance Testing_Backtrace - Fatal编程技术网

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

Mysql 从SQL查询回溯到应用程序代码?,mysql,ruby-on-rails,logging,performance-testing,backtrace,Mysql,Ruby On Rails,Logging,Performance Testing,Backtrace,有没有办法在Rails开发日志中找到哪行代码生成了MySQL语句 为了进行性能优化,我想找出我的应用程序的哪个部分正在创建哪个MySQL查询。当我查看我的日志时,我看到在我做的每个web请求上都有成百上千的查询在闪烁,我需要找出它们来自哪里 我正在考虑向日志输出中添加一些变量,如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 这可能吗?您有几个选择。这些选项

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

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

我正在考虑向日志输出中添加一些变量,如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


这可能吗?

您有几个选择。这些选项中没有一个会像在错误上获得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查询是作为
    PublicController
    中的
    index
    操作的一部分触发的,或者作为触发此操作的结果,该控制器呈现的一个视图触发的

  • 如果要分析的内容太多,可以使用
    debugger
    命令在不同点停止输出,并允许您检查发生了什么。更多关于

  • 您可以使用
    Rails.logger.info“我的信息信息”
    Rails.logger.error“我的错误信息”
    (取决于您希望它出现在默认日志还是错误日志中,等等)直接在应用程序日志中输出内容


  • 为您提供每个SQL查询的回溯以及一组有用的统计信息。

    “触发SQL查询的实际行可能隐藏在帮助程序、模型或视图代码调用的任何其他地方。”我试图找出的是,从哪个模型或帮助程序等。。确切地有可能找到答案吗?日志的这一部分是从哪个模块或类创建的?(40.9ms)从“研究”中选择计数()(49.6ms)从“活动”中选择计数(不同的“活动”。“whodidit”)从“参与”中选择计数()(35.3ms)你能发布一些代码和部分日志吗?要弄清SQL查询的来源并不难,只需查看代码即可,但我需要您发布一些实际的代码,或者至少是相关的日志。对于您当前的问题,我所能做的只是给您一些一般性的建议,因为您的问题本质上是非常一般的。从我发布的日志中,我可以告诉您SQL发生在控制器(或它调用的某个方法)中,而不是视图中,这仅仅是因为SQL记录在呈现视图的日志行之前。了解这一点主要是了解Rails调用的流程。它发出一个请求,它被路由到一个控制器动作,动作代码被运行,视图被呈现(这意味着视图和视图中嵌入的代码被执行),基本上就是这样。日志是按时间顺序执行的。您可以在您认为SQL正在运行的区域周围放置一些日志输出行,然后慢慢缩小它的范围,直到找到它发生的确切位置。这也可能是因为当你可以的时候,你并不急于加载,或者是一些相当直接的事情。不过,我需要查看您的日志。好的,很高兴知道…:-)这对我的下一步应该很有帮助,如果我遇到问题,我将发布一些示例。如果你不知道从哪里获得rails 2.x的插件,他们网站上命名的svn repo似乎已经关闭了。不幸的是,我看不到rails 4.0中有这种功能。