ActiveRecord logging: include current DB role and shard when using Multiple Databases

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_to and 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)