Module: ActiveRecord::QueryLogs
Relationships & Source Files | |
Defined in: | activerecord/lib/active_record/query_logs.rb, activerecord/lib/active_record/query_logs_formatter.rb |
Overview
Automatically append comments to SQL queries with runtime information tags. This can be used to trace troublesome SQL statements back to the application code that generated these statements.
Query logs can be enabled via Rails configuration in config/application.rb
or an initializer:
config.active_record. = true
By default the name of the application, the name and action of the controller, or the name of the job are logged. The default format is / SQLCommenter. The tags shown in a query comment can be configured via Rails configuration:
config.active_record. = [ :application, :controller, :action, :job ]
Active Record defines default tags available for use:
-
application
-
pid
-
socket
-
db_host
-
database
Action Controller adds default tags when loaded:
-
controller
-
action
-
namespaced_controller
Active Job adds default tags when loaded:
-
job
New comment tags can be defined by adding them in a ::Hash
to the tags ::Array
. Tags can have dynamic content by setting a Proc
or lambda value in the ::Hash
, and can reference any value stored by Rails in the context
object. ::ActiveSupport::CurrentAttributes
can be used to store application values. Tags with nil
values are omitted from the query comment.
Escaping is performed on the string returned, however untrusted user input should not be used.
Example:
config.active_record. = [
: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",
},
]
By default the name of the application, the name and action of the controller, or the name of the job are logged using the / SQLCommenter format. This can be changed via config.active_record.query_log_tags_format
Tag comments can be prepended to the query:
ActiveRecord::QueryLogs.prepend_comment = true
For applications where the content will not change during the lifetime of the request or job execution, the tags can be cached for reuse in every query:
config.active_record. = true
Class Attribute Summary
- .cache_query_log_tags rw
- .prepend_comment rw
- .taggings rw
- .tags rw
- .tags_formatter rw
Class Method Summary
-
.update_formatter(format)
Updates the formatter to be what the passed in format is.
Class Attribute Details
.cache_query_log_tags (rw)
[ GitHub ]# File 'activerecord/lib/active_record/query_logs.rb', line 77
mattr_accessor :, instance_accessor: false, default: false
.prepend_comment (rw)
[ GitHub ]# File 'activerecord/lib/active_record/query_logs.rb', line 76
mattr_accessor :prepend_comment, instance_accessor: false, default: false
.taggings (rw)
[ GitHub ]# File 'activerecord/lib/active_record/query_logs.rb', line 74
mattr_accessor :taggings, instance_accessor: false, default: {}
.tags (rw)
[ GitHub ]# File 'activerecord/lib/active_record/query_logs.rb', line 75
mattr_accessor :, instance_accessor: false, default: [ :application ]
.tags_formatter (rw)
[ GitHub ]# File 'activerecord/lib/active_record/query_logs.rb', line 78
mattr_accessor :, instance_accessor: false
Class Method Details
.update_formatter(format)
Updates the formatter to be what the passed in format is.
# File 'activerecord/lib/active_record/query_logs.rb', line 99
def update_formatter(format) self. = case format when :legacy LegacyFormatter.new when :sqlcommenter SQLCommenter.new else raise ArgumentError, "Formatter is unsupported: #{formatter}" end end