跳到內容 跳到搜尋

Active Record Query Logs

自動將註解附加到具有執行時間資訊標籤的 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

  • socket

  • db_host

  • 資料庫

  • source_location

在載入時,Action Controller 會新增預設標籤

  • 控制項

  • 動作

  • namespaced_controller

在載入時,Active Job 會新增預設標籤

  • 工作

可透過將新註解標籤新增到 tags 陣列中的 Hash 來定義。標籤可以透過設定 Hash 中的 Proc 或 lambda 值有動態內容,而且可以參照儲存在 context 物件中的任何 Rails 值。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