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 -
source_location
警告:计算查询的 source_location 可能会很慢,因此在生产环境中使用时应考虑其影响。
另请参阅 config.active_record.verbose_query_logs。
Action Controller 加载时添加默认标签。
-
controller -
action -
namespaced_controller
Active Job 加载时添加默认标签。
-
job
可以通过将新注释标签添加到 Hash 中的 Array 来定义。通过在 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 进行更改。
可以在查询前添加标签注释。
config.active_record.query_log_tags_prepend_comment = true
对于在请求或作业执行期间内容不会更改的应用程序,可以缓存标签以便在每次查询中重用。
config.active_record.cache_query_log_tags = true