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
类公共方法
update_formatter(format) 链接
将格式化程序更新为传入的格式。
来源:显示 | 在 GitHub 上
# 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