web-dev-qa-db-ja.com

MongoDBによるすべてのクエリのログ記録

質問はそれが単純であるのと同じくらい基本的です...どのようにあなたはmongodbの中で「末尾の」可能なログファイルにすべての質問を記録しますか?

私が試してみました:

  • プロファイリングレベルを設定する
  • slow msパラメータの開始を設定する
  • -vvオプション付きのmongod

/var/log/mongodb/mongodb.logは、現在アクティブな接続数だけを表示し続けます...

146

私はこのようにしてmongodを起動することでこれを解決しました(槌で打たれて醜い、ええ...でも開発環境ではうまくいきます):

mongod --profile=1 --slowms=1 &

これによりプロファイリングが有効になり、「遅いクエリ」のしきい値が1msに設定され、すべてのクエリが「遅いクエリ」としてファイルに記録されます。

/var/log/mongodb/mongodb.log

今、私はコマンドを使用して連続的なログ出力を得ます:

tail -f /var/log/mongodb/mongodb.log

ログの例:

Mon Mar  4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms
77

すべてのクエリをログに記録することができます。

$ mongo
MongoDB Shell version: 2.4.9
connecting to: test
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()

出典: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

db.setProfilingLevel(2)は「すべての操作をログに記録する」という意味です。

227
Kristóf Dombi

そのグーグルの最初の答えだから...
バージョン3用

$ mongo
MongoDB Shell version: 3.0.2
connecting to: test
> use myDb
switched to db
> db.setLogLevel(1)

http://docs.mongodb.org/manual/reference/method/db.setLogLevel/

30
barak

MongoDBには、プロファイリングという高度な機能があります。ロギングはsystem.profileコレクションで行われます。ログは以下から見ることができます。

db.system.profile.find()

3つのログレベルがあります( source ):

  • レベル0 - プロファイラはオフです。データを収集しません。 mongodは常にslowOpThresholdMsしきい値よりも長い操作をログに書き込みます。これはデフォルトのプロファイラレベルです。
  • レベル1 - 遅い操作についてのみプロファイリングデータを収集します。デフォルトでは、スローオペレーションは100ミリ秒より遅いものです。 slowOpThresholdMsランタイムオプションまたはsetParameterコマンドを使用して、「低速」操作のしきい値を変更できます。詳細については、「遅い操作のしきい値の指定」を参照してください。
  • レベル2 - すべてのデータベース操作に関するプロファイリングデータを収集します。

データベースがどのプロファイリングレベルで実行されているかを確認するには、次のコマンドを使用します。

db.getProfilingLevel()

そして状態を見るため

db.getProfilingStatus()

プロファイリングステータスを変更するには、次のコマンドを使用します。

db.setProfilingLevel(level, milliseconds)

ここで、levelはプロファイリングレベルを表し、millisecondsはクエリをログに記録する必要がある期間のmsです。ロギングをオフにするには、

db.setProfilingLevel(0)

タイムスタンプの降順で並べられた、1秒を超えたすべてのクエリについてシステムプロファイルコレクションを調べるクエリは、次のようになります。

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
22
student

プロファイラの動作を有効にしてログを"tail"できるの方法で表示するためのコマンドラインツールを作成しました。 "mongotail".

しかし、より興味深い機能(tailも同様)は、-fオプションを使用して"real time"の変更を確認し、場合によってはgrepを使用して結果をフィルター処理することです。

のドキュメントとインストール手順を参照してください。 https://github.com/mrsarm/mongotail

20
Mariano Ruiz

プロファイリングレベルがdb.setProfilingLevel(2)を使って設定されたら。

下記のコマンドは最後に実行されたクエリを表示します。
より少ない/より多くのクエリを見るために制限(5)も変更できます。
$ nin - プロファイルとインデックスのクエリを除外します
また、クエリフィールドを表示するためだけにクエリプロジェクション{'query':1}を使用してください

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
} 
).limit(5).sort( { ts : -1 } ).pretty()

クエリプロジェクションのみでログを記録する

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
9

プロファイラーデータは、ファイルではなく、DB内のコレクションに書き込まれます。 http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/ を参照してください。

私は10genの MMS サービスを使うことをお勧めします。そしてそこで開発プロファイラーデータをフィードしてください。そこであなたはそれをフィルタリングしてUIでソートすることができます。

7
Hans N. Hjort

クエリをmongodbログファイルに記録する場合は、次のようにログレベルとプロファイリングの両方を設定する必要があります。

db.setLogLevel(1)
db.setProfilingLevel(2)

https://docs.mongodb.com/manual/reference/method/db.setLogLevel を参照)

プロファイリングのみを設定しても、クエリはファイルに記録されません。

db.system.profile.find().pretty()
6
DariusNica

エレガントではありませんが、 oplogcouldは部分的にこの目的で使用されていると思います。すべての書き込みを記録しますが、読み取りは記録しません...

私が正しいなら、あなたは複製を有効にする必要があります。情報は この回答から この質問から: MongoDBコレクションへの変更をリッスンする方法?

4
ppeterka

Profilinglevelを2に設定すると、すべてのクエリをログに記録することができます。

4
Shnkc

私はmongosniffをチェックすることを勧めます。これは、あなたが望むことやそれ以上のことができるツールです。特に、それは大規模なMongoシステムの問題や、問い合わせがどのようにルーティングされているのか、そしてどこから来ているのかを診断するのに役立ちます。

http://docs.mongodb.org/v2.2/reference/mongosniff/

3
Daniel Williams
db.adminCommand( { getLog: "*" } )

それから

db.adminCommand( { getLog : "global" } )
1
HareesH P

クエリが入ってくるとリアルタイムでsystem.profileログを出力するスクリプトを書きました。他の答えで述べたように、まずロギングを有効にする必要があります。私はLinux用のWindows Subsystemを使用しているのでこれが必要でしたが、それに対してはまだうまくいきません。

https://github.com/dtruel/mongo-live-logger

1
user3413723

(oplog操作なしで)すべてのクエリを調整するためにこのパッケージを試してみてください。 https://www.npmjs.com/package/mongo-tail-queries

(免責事項:私はまさにこのニーズのためにこのパッケージを書きました)

0
dmchk