创建一个新文件config/initializers/multidb_logger.rb
用这个代码:
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
alias_method(:origin_log, :log)
def log(sql, name = 'SQL', binds = [], type_casted_binds = [], statement_name = nil, &block)
sql = "#{sql} /* #{@config[:replica] ? 'REPLICA' : 'MASTER'} DB */"
origin_log(sql, name, binds, type_casted_binds, statement_name, &block)
end
end
ActiveRecord::LogSubscriber.class_eval do
alias_method(:origin_extract_query_source_location, :extract_query_source_location)
def extract_query_source_location(locations)
new_locations = locations.reject { |loc| loc.include? File.basename(__FILE__) }
origin_extract_query_source_location(new_locations)
end
end
现在,在 ActiveRecord 记录的 SQL 查询中,您将在每个查询的末尾看到“REPLICA DB”或“MASTER DB”。
该解决方案使用与 @Lam Phan 解决方案类似的方法,但它保留了所有标准日志记录行为:
- 它不记录 SCHEMA 查询
- 它正确显示触发查询的源文件和行
另请注意,我没有使用ActiveRecord::Base.current_role
获取角色,因为它没有显示可靠的信息(即它打印角色writing
但查询会转到副本数据库)。
可以使用中提供的信息进一步定制日志@config
哈希值,例如host
, port
, database
, etc.