跳至内容 跳至搜索

Active Record 查询日志

自动向 SQL 查询追加包含运行时信息标签的注释。这可以用于将有问题的 SQL 语句追溯到生成这些语句的应用程序代码。

可以通过 Rails 配置在 config/application.rb 或初始化器中启用查询日志。

config.active_record.query_log_tags_enabled = true

默认情况下,会记录应用程序的名称、控制器和操作的名称,或者作业的名称。默认格式是 SQLCommenter。查询注释中显示的标签可以通过 Rails 配置进行配置。

config.active_record.query_log_tags = [ :application, :controller, :action, :job ]

Active Record 定义了可用的默认标签。

  • application

  • pid

  • socket

  • db_host

  • database

  • source_location

警告:计算查询的 source_location 可能会很慢,因此在生产环境中使用时应考虑其影响。

另请参阅 config.active_record.verbose_query_logs

Action Controller 加载时添加默认标签。

  • controller

  • action

  • namespaced_controller

Active Job 加载时添加默认标签。

  • job

可以通过将新注释标签添加到 Hash 中的 Array 来定义。通过在 Hash 中设置 Proc 或 lambda 值,标签可以具有动态内容,并且可以引用 Rails 存储在 context 对象中的任何值。 ActiveSupport::CurrentAttributes 可用于存储应用程序值。值为 nil 的标签将被从查询注释中省略。

将对返回的字符串执行转义,但是不应使用不可信的用户输入。

示例

config.active_record.query_log_tags = [
  :namespaced_controller,
  :action,
  :job,
  {
    request_id: ->(context) { context[:controller]&.request&.request_id },
    job_id: ->(context) { context[:job]&.job_id },
    tenant_id: -> { Current.tenant&.id },
    static: "value",
  },
]

默认情况下,会使用 SQLCommenter 格式记录应用程序的名称、控制器和操作的名称,或者作业的名称。可以通过 config.active_record.query_log_tags_format 进行更改。

可以在查询前添加标签注释。

config.active_record.query_log_tags_prepend_comment = true

对于在请求或作业执行期间内容不会更改的应用程序,可以缓存标签以便在每次查询中重用。

config.active_record.cache_query_log_tags = true