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