異なるデータベースへの複数の接続を持つActiveRecordアプリケーションでは、ログにはどのクエリがどのデータベースに送られたかが示されません。データベースを分離するために、これらのクエリ:どのデータベースにどのクエリが送られたかを示すActiveRecordログ
Base1.connection.select_value("select * from foo")
Base2.connection.select_value("select * from foo")
は、これらのログエントリを放ち:
D, [2017-03-13T09:27:11.844395 #22112] DEBUG -- : (0.6ms) select * from foo
D, [2017-03-13T09:27:11.844539 #22112] DEBUG -- : (0.1ms) select * from foo
は、どのように私はActiveRecordのデータベースのログは、クエリはに対して行われたデータベースを示すために、原因となることができますか?
スタンドアロン例
begin
require "bundler/inline"
rescue LoadError => e
$stderr.puts "Bundler version 1.10 or later is required."
raise e
end
gemfile(true) do
source "https://rubygems.org"
# Activate the gem you are reporting the issue against.
gem "activerecord", "4.2.8"
gem "sqlite3"
end
require "active_record"
require "logger"
class Base1 < ActiveRecord::Base
self.abstract_class = true
end
class Base2 < ActiveRecord::Base
self.abstract_class = true
end
Base1.establish_connection(adapter: "sqlite3", database: ":memory:")
Base2.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Base.logger = Logger.new(STDOUT)
Base1.connection.execute("create table foo(i int)")
Base2.connection.execute("create table foo(i int)")
Base1.connection.execute("insert into foo(i) values (1)")
Base2.connection.execute("insert into foo(i) values (2)")
raise unless Base1.connection.select_value("select * from foo") == 1
raise unless Base2.connection.select_value("select * from foo") == 2
出力:
D, [2017-03-13T09:27:11.842939 #22112] DEBUG -- : (0.2ms) create table foo(i int)
D, [2017-03-13T09:27:11.843478 #22112] DEBUG -- : (0.2ms) create table foo(i int)
D, [2017-03-13T09:27:11.843612 #22112] DEBUG -- : (0.1ms) insert into foo(i) values (1)
D, [2017-03-13T09:27:11.843720 #22112] DEBUG -- : (0.0ms) insert into foo(i) values (2)
D, [2017-03-13T09:27:11.844395 #22112] DEBUG -- : (0.6ms) select * from foo
D, [2017-03-13T09:27:11.844539 #22112] DEBUG -- : (0.1ms) select * from foo
私が変更できるように、私は、各接続に独自のロガーを与える試み各接続
ための別個のロガーを作成しようとしました各ログのフォーマット:
Base1.logger = Logger.new(STDOUT)
Base2.logger = Logger.new(STDOUT)
しかし、残念ながら、例外発生しません。この線で示すように、ActiveRecordので唯一のロガーがあるように表示されます。
- ルビー2.3.3
raise unless Base1.logger.object_id == Base2.logger.object_id
バージョンこの例ではActiveRecord 4.2.8
(1)この問題は、特定のデータベースアダプタに固有の問題ではありません。私は完全版のためにアダプターのバージョンを記載しました。
ログメッセージでアダプタのクラス名を使用することをお勧めします。私の場合、私は同じデータベースエンジンに複数の接続を持っているので、私にとってはうまくいかないでしょうが、@ idejの答えに加えたトリッキーよりも簡単で多くのことができます。 –
ああ、私は間違ってあなたが異なるDBエンジンを持っていると思った。あなたはデバッガに落として、 'self'を調べることができます。これは、接続に関する多くのデータを持つ接続オブジェクトです。識別子として有用なものを使用できます。 –
あなたは間違ったことはありません:私は異なるDBエンジンを持っています。私はまた、これらのエンジンの1つに複数の接続を持っています。私のアプリケーションは面倒です! –