Summary
When using Rails Multiple Databases, the default ActiveRecord SQL log output does not indicate which database role(writing or reading) and shard(shard_one and shard_two) is currently in use .
This makes it difficult to verify routing behavior and diagnose issues in environments with writer/replica setup.
Current behavior
Given:
class ApplicationRecord < ActiveRecord::Base
connects_to database: { writing: :primary, reading: :primary_replica }
end
and:
ActiveRecord::Base.connected_to(role: :writing) { User.count }
the default log looks like:
User Count (0.3ms) SELECT COUNT(*) FROM `users`
No role/connection information is shown.
Problem
In multi-DB applications, developers need to quickly confirm whether a query ran against writer or reader. Without role visibility in logs, it is hard to:
- validate read/write splitting
- debug unexpected replica reads/writes
- investigate consistency/replication-lag related behavior
Proposal
Include the current connection role and shard in SQL log lines when Multiple Databases is enabled.
Example:
[db:writing] User Count (db time 0.3ms, cpu time 0.0866ms) SELECT COUNT(*) FROM `users`
[db:reading,shard:shard_two] User Count (db time 0.5ms, cpu time 0.1154ms) SELECT COUNT(*) FROM `users`
At minimum, adding role labels like [writing] / [reading] would significantly improve observability.
Expected benefits
- Better debugging and operational visibility for multi-DB apps
- Easier verification of
connected_toand automatic role switching behavior - Reduced ambiguity in development and production logs
Compatibility
This could be introduced in a backward-compatible way, for example:
- enabled automatically only when multiple DB roles are configured, or
- controlled by a config flag (opt-in/opt-out)