@kyanny's blog

My thoughts, my life. Views/opinions are my own.

MongoClient (Ruby) と MongoMapper でのログ出力の設定方法

TL;DR MongoMapper.connection.logger.level = 1


Rails コンソールでいろいろやるとき MongoDB へのクエリのログがたくさん表示されて一時的にオフにしたいけどどうやるんだっけ、というのを毎回検索しては探すのに苦労するのでまとめた。

https://github.com/kyanny/mongoclient-mongomapper-logging

  • MongoMapper.connection は Mongo::MongoClient のインスタンスである
  • なので logging の設定は Mongo::MongoClient.new するときに :logger オプションで Logger のインスタンスを渡せばよい
  • Mongo::MongoClient インスタンスに logger= メソッドは無いので初期化時に logger オブジェクトを渡しておかないと後から logging を有効にすることができない
  • Mongo::MongoClient.logger は Logger のインスタンスなのでログ出力を制御したければ普通に logger.level= で好きなログレベルを設定すればよい

ログレベルの設定をいじらず Logger インスタンスを渡すだけだと find や insert クエリもログが表示される。これは Logger インスタンスを作ったときのデフォルトのログレベルが DEBUG だから。

$ ruby 01mongo.rb
==> MongoClient (full logging)
D, [2015-02-07T01:54:19.948725 #7780] DEBUG -- : MONGODB [DEBUG] Logging level is currently :debug which could negatively impact client-side performance. You should set your logging level no lower than :info in production.
D, [2015-02-07T01:54:20.020707 #7780] DEBUG -- : MONGODB (69.2ms) admin['$cmd'].find({:isMaster=>1}).limit(-1)
D, [2015-02-07T01:54:20.071675 #7780] DEBUG -- : MONGODB (50.3ms) test['$cmd'].find({:insert=>"dogs", :documents=>[{:name=>"John", :_id=>BSON::ObjectId('54d4f1bc421cdc1e64000001')}], :writeConcern=>{:w=>1}, :ordered=>true}).limit(-1)
D, [2015-02-07T01:54:20.071834 #7780] DEBUG -- : MONGODB (50.6ms) test['dogs'].insert({:name=>"John", :_id=>BSON::ObjectId('54d4f1bc421cdc1e64000001')})

connection オブジェクトを作ってすぐにログレベルを変更すると、クエリのログは表示されない。

$ ruby 02mongo.rb
==> MongoClient (log level :info)
D, [2015-02-07T01:56:20.440966 #7901] DEBUG -- : MONGODB [DEBUG] Logging level is currently :debug which could negatively impact client-side performance. You should set your logging level no lower than :info in production.
D, [2015-02-07T01:56:20.443090 #7901] DEBUG -- : MONGODB (0.6ms) admin['$cmd'].find({:isMaster=>1}).limit(-1)

最初から全てのログをオフにしたい場合はあらかじめログレベルを変更した Logger インスタンスをオプションで渡せばよい。

$ ruby 02mongo.rb
==> MongoClient (log level :info)
D, [2015-02-07T01:56:20.440966 #7901] DEBUG -- : MONGODB [DEBUG] Logging level is currently :debug which could negatively impact client-side performance. You should set your logging level no lower than :info in production.
D, [2015-02-07T01:56:20.443090 #7901] DEBUG -- : MONGODB (0.6ms) admin['$cmd'].find({:isMaster=>1}).limit(-1)

MongoMapper の場合も冒頭に書いたとおり、やることは同じ。ログの出方も同じ。

==> MongoMapper (enable logging)
D, [2015-02-07T02:01:06.147308 #8149] DEBUG -- : MONGODB [DEBUG] Logging level is currently :debug which could negatively impact client-side performance. You should set your logging level no lower than :info in production.
D, [2015-02-07T02:01:06.155012 #8149] DEBUG -- : MONGODB (6.2ms) admin['$cmd'].find({:isMaster=>1}).limit(-1)
D, [2015-02-07T02:01:06.305866 #8149] DEBUG -- : MONGODB (1.4ms) test['$cmd'].find({:insert=>"dogs", :documents=>[{"_id"=>BSON::ObjectId('54d4f352421cdc1fd5000001'), "name"=>"John"}], :writeConcern=>{:w=>1}, :ordered=>true}).limit(-1)
D, [2015-02-07T02:01:06.306012 #8149] DEBUG -- : MONGODB (1.8ms) test['dogs'].insert({"_id"=>BSON::ObjectId('54d4f352421cdc1fd5000001'), "name"=>"John"})
$ ruby 05mongomapper.rb
==> MongoMapper (log level :info)
D, [2015-02-07T02:01:19.208870 #8223] DEBUG -- : MONGODB [DEBUG] Logging level is currently :debug which could negatively impact client-side performance. You should set your logging level no lower than :info in production.
D, [2015-02-07T02:01:19.216361 #8223] DEBUG -- : MONGODB (5.8ms) admin['$cmd'].find({:isMaster=>1}).limit(-1)
$ ruby 06mongomapper.rb
==> MongoMapper (suppress logging)