跳至内容 跳至搜索

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 定义了可用于的默认标签

  • 应用程序

  • pid

  • 套接字

  • db_host

  • 数据库

  • source_location

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

  • 控制器

  • 操作

  • namespaced_controller

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

  • 作业

可以通过在标签 Array 中的 Hash 中添加新的注释标签来定义新的注释标签。 标签可以通过在 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 进行更改

标签注释可以预先添加到查询

ActiveRecord::QueryLogs.prepend_comment = true

对于在请求或作业执行的整个生命周期中内容不会更改的应用程序,可以缓存标签以便在每个查询中重复使用

config.active_record.cache_query_log_tags = true