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

zqdjd7g9  于 2023-02-03  发布在  Mysql
关注(0)|答案(3)|浏览(129)

有没有办法在Rails开发日志中找到生成MySQL语句的代码行?
为了做一些性能优化,我想找出我的应用程序的哪一部分正在创建哪些MySQL查询。当我查看日志时,我看到我所做的每个Web请求上都 Flink 着数百个查询,我需要找出它们来自哪里。
我考虑在日志输出中添加一些变量,如____FILE________LINE____
这可能吗?

zf9nrax1

zf9nrax11#

https://github.com/lightyear/sql-logging为每个SQL查询提供了回溯,并提供了一系列有用的统计信息。

k2arahey

k2arahey2#

你有几个选项,这些选项都不会像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查询的实际行可能隐藏在helper、model或视图代码调用的任何地方。

Processing by PublicController#index as HTML

最后的as HTML位告诉您请求是什么格式,因此响应中可能使用哪个视图/格式。
因此,这基本上告诉您,SQL查询是作为PublicControllerindex操作的一部分触发的,或者是作为触发此操作的结果,控制器呈现的视图之一触发的。
1.如果要解析的内容太多,可以使用debugger命令在不同的点停止输出,并允许您检查正在发生的事情。
1.您可以使用Rails.logger.info "My info message"Rails.logger.error "My error message"(取决于您是否希望它出现在默认日志或错误日志等)直接在应用日志中输出内容。

hof1towb

hof1towb3#

您可以使用指令插入:

ActiveSupport::Notifications.subscribe("sql.active_record") { puts caller.grep(/#{Rails.root}/) }

相关问题