2014年9月16日火曜日

MongoDBで実行クエリを必ずログに出力する方法

概要

Mongoクライアントから実行されたクエリを毎回ログファイルに出力するようにします
例えばサードパーティのライブラリから実行されているクエリがどんなクエリか知りたい場合に使えると思います

環境準備

  • Mac OS X 10.8.5
  • MongoDB 2.6.4

設定

MongoDBを起動するときにprofileslowmsオプションを付与します

mongod --logpath=/var/log/mongodb/mongo.log --profile=1 --slowms=-1

profileを1に指定し、slowmsを-1にして起動します
--logpathは各自の環境に合わせて設定してください

ちょっとしたTips

slowmsの部分を「1にして起動してください」という記事を何個か見ましたが、そうすると1ms以下で処理されたクエリはロギング対象にならないため、データが少ない場合にロギングすることができません

ただ、slowmsを-1にするとすべてのクエリがスロークエリと判断されるため管理系のクエリも大量にロギングされてしまいます
例えば以下のようなログが大量にロギングされると思います

2014-09-16T19:45:42.585+0900 [conn56] command admin.$cmd command: buildInfo { buildinfo: 1 } keyUpdates:0 numYields:0  reslen:854 0ms

なので上記の設定で必要なクエリ情報だけ確認したい場合はgrepコマンドと合わせて使用するのがいいと思います

tail -f mongo.log | grep -v "command admin.\$cmd command:"

あとprofileオプションに関してですが、いくつか設定があり
「1」はスロークエリのみ表示することができる設定ですが、今回に限ってはすべてがスロークエリになるので関係ありません
また「2」という設定もあり、これはすべてのオペレーションを表示する設定となります
今回はオペレーション系の操作も1ms以下で処理されるので1でも2でも管理系のクエリがロギングされてしまいます

とりあえず開発環境でデバッグしたいときには使えると思いますが、本番でslowms=-1にするのは出力されるログの量も考えて、あまりおすすめはしません
あとは管理系クエリを除いたクエリがすべて1ms以上かかるのであれば--profile=1 --slowms=1で問題ないと思います

うーん、とは言え何かもうちょっといい方法はないのだろうか

参考サイト

0 件のコメント:

コメントを投稿