跳至内容 跳至搜索

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

Action Controller 加载后会添加默认标签

  • controller

  • action

  • namespaced_controller

Active Job 加载后会添加默认标签

  • 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
方法
U

类公共方法

update_formatter(format)

将格式化程序更新为传入的格式。

# File activerecord/lib/active_record/query_logs.rb, line 99
def update_formatter(format)
  self.tags_formatter =
    case format
    when :legacy
      LegacyFormatter.new
    when :sqlcommenter
      SQLCommenter.new
    else
      raise ArgumentError, "Formatter is unsupported: #{formatter}"
    end
end