質問はそれが単純であるのと同じくらい基本的です...どのようにあなたはmongodbの中で「末尾の」可能なログファイルにすべての質問を記録しますか?
私が試してみました:
/var/log/mongodb/mongodb.logは、現在アクティブな接続数だけを表示し続けます...
私はこのようにして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
すべてのクエリをログに記録することができます。
$ 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)
は「すべての操作をログに記録する」という意味です。
そのグーグルの最初の答えだから...
バージョン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/
MongoDB
には、プロファイリングという高度な機能があります。ロギングはsystem.profile
コレクションで行われます。ログは以下から見ることができます。
db.system.profile.find()
3つのログレベルがあります( source ):
データベースがどのプロファイリングレベルで実行されているかを確認するには、次のコマンドを使用します。
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 } )
プロファイラの動作を有効にしてログを"tail"できるの方法で表示するためのコマンドラインツールを作成しました。 "mongotail".
しかし、より興味深い機能(tail
も同様)は、-f
オプションを使用して"real time"の変更を確認し、場合によってはgrep
を使用して結果をフィルター処理することです。
のドキュメントとインストール手順を参照してください。 https://github.com/mrsarm/mongotail
プロファイリングレベルが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()
プロファイラーデータは、ファイルではなく、DB内のコレクションに書き込まれます。 http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/ を参照してください。
私は10genの MMS サービスを使うことをお勧めします。そしてそこで開発プロファイラーデータをフィードしてください。そこであなたはそれをフィルタリングしてUIでソートすることができます。
クエリをmongodbログファイルに記録する場合は、次のようにログレベルとプロファイリングの両方を設定する必要があります。
db.setLogLevel(1)
db.setProfilingLevel(2)
( https://docs.mongodb.com/manual/reference/method/db.setLogLevel を参照)
プロファイリングのみを設定しても、クエリはファイルに記録されません。
db.system.profile.find().pretty()
エレガントではありませんが、 oplogcouldは部分的にこの目的で使用されていると思います。すべての書き込みを記録しますが、読み取りは記録しません...
私が正しいなら、あなたは複製を有効にする必要があります。情報は この回答から この質問から: MongoDBコレクションへの変更をリッスンする方法?
Profilinglevelを2に設定すると、すべてのクエリをログに記録することができます。
私はmongosniffをチェックすることを勧めます。これは、あなたが望むことやそれ以上のことができるツールです。特に、それは大規模なMongoシステムの問題や、問い合わせがどのようにルーティングされているのか、そしてどこから来ているのかを診断するのに役立ちます。
db.adminCommand( { getLog: "*" } )
それから
db.adminCommand( { getLog : "global" } )
クエリが入ってくるとリアルタイムでsystem.profileログを出力するスクリプトを書きました。他の答えで述べたように、まずロギングを有効にする必要があります。私はLinux用のWindows Subsystemを使用しているのでこれが必要でしたが、それに対してはまだうまくいきません。
(oplog操作なしで)すべてのクエリを調整するためにこのパッケージを試してみてください。 https://www.npmjs.com/package/mongo-tail-queries
(免責事項:私はまさにこのニーズのためにこのパッケージを書きました)