質問は単純であると同時に基本的なものです...mongodbの「テール」可能なログファイルにすべてのクエリをどのように記録しますか?
私が試してみました:
- プロファイリングレベルの設定
- 遅いmsパラメータの開始を設定する
- -vvオプションを指定したmongod
/var/log/mongodb/mongodb.logは、アクティブな接続の現在の数だけを表示し続けます...
すべてのクエリをログに記録できます。
$ 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)
「すべての操作をログに記録する」という意味です。
私はこのようにmongodを開始することでこれを解決することになりました(ハンマーで醜い、ええ...しかし開発環境では機能します):
mongod --profile=1 --slowms=1 &
これにより、プロファイリングが可能になり、「低速クエリ」のしきい値が1ミリ秒に設定され、すべてのクエリが「低速クエリ」としてファイルに記録されます。
/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
そのグーグルの最初の答えのために...
バージョン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つのロギングレベルがあります(ソース):
データベースが実行されているプロファイリングレベルを確認するには、次を使用します。
db.getProfilingLevel()
ステータスを確認するには
db.getProfilingStatus()
プロファイリングステータスを変更するには、次のコマンドを使用します
db.setProfilingLevel(level, milliseconds)
ここlevel
で、はプロファイリングレベルを指しmilliseconds
、クエリをログに記録する必要がある期間のミリ秒です。ロギングをオフにするには、
db.setProfilingLevel(0)
タイムスタンプの降順で1秒以上かかったすべてのクエリについて、システムプロファイルコレクションを検索するクエリは次のようになります。
db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
プロファイラーアクティビティをアクティブにして、 「テール」可能な方法でログを表示するコマンドラインツールを作成しました-> 「mongotail」:
$ mongotail MYDATABASE
2015-02-24 19:17:01.194 QUERY [Company] : {"_id": ObjectId("548b164144ae122dc430376b")}. 1 returned.
2015-02-24 19:17:01.195 QUERY [User] : {"_id": ObjectId("549048806b5d3db78cf6f654")}. 1 returned.
2015-02-24 19:17:01.196 UPDATE [Activation] : {"_id": "AB524"}, {"_id": "AB524", "code": "f2cbad0c"}. 1 updated.
2015-02-24 19:17:10.729 COUNT [User] : {"active": {"$exists": true}, "firstName": {"$regex": "mac"}}
...
しかし、より興味深い機能(も同様tail
)は、オプションを使用して「リアルタイム」-f
で変更を確認し、場合によっては結果をフィルタリングしgrep
て特定の操作を見つけることです。
https://github.com/mrsarm/mongotailのドキュメントとインストール手順を参照してください
クエリをmongodbログファイルに記録する場合は、次のように、ログレベルとプロファイリングの両方を設定する必要があります。
db.setLogLevel(1)
db.setProfilingLevel(2)
(https://docs.mongodb.com/manual/reference/method/db.setLogLevelを参照してください)
プロファイリングのみを設定すると、クエリはファイルに記録されないため、次の場所からのみ取得できます。
db.system.profile.find().pretty()
を使用してプロファイリングレベルを設定したらdb.setProfilingLevel(2)
。
次のコマンドは、最後に実行されたクエリを出力します。
limit(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でフィルター処理して並べ替えることをお勧めします。
エレガントではありませんが、oplog はこの目的で部分的に使用できると思います。つまり、すべての書き込みをログに記録しますが、読み取りはログに記録しません。
私が正しければ、replicatoonを有効にする必要があります。情報は、この質問からのこの回答からのものです:MongoDBコレクションへの変更をリッスンする方法は?
profilinglevelを2に設定することは、すべてのクエリをログに記録するためのもう1つのオプションです。
db.setProfilingLevel(2,-1)
これはうまくいきました!すべてのクエリ情報をmongodログファイルに記録しました
mongosniffをチェックすることをお勧めします。このツールは、必要なことすべてを実行できます。特に、大規模なmongoシステムの問題や、mongoに関連するすべての通信についてネットワークインターフェイスをリッスンすることで機能するため、クエリがどのようにルーティングされ、どこから送信されているかを診断するのに役立ちます。
クエリが着信すると、system.profileログをリアルタイムで出力するスクリプトを作成しました。他の回答に記載されているように、最初にログを有効にする必要があります。Linux用のWindowsSubsystemを使用しているので、これが必要でしたが、テールはまだ機能しません。
db.adminCommand( { getLog: "*" } )
それで
db.adminCommand( { getLog : "global" } )
これはずっと前に尋ねられましたが、これはまだ誰かを助けるかもしれません:
MongoDBプロファイラーは、上限付きコレクションsystem.profile内のすべてのクエリをログに記録します。これを参照してください:データベースプロファイラー
--profile=2
すべてのクエリのログ記録を有効にするオプションを使用
してmongodインスタンスを起動するか、mongodインスタンスがすでに実行されている場合は、mongoshellから、データベースを選択した後に実行しdb.setProfilingLevel(2)
ます。(によって確認できます db.getProfilingLevel()
。これはを返す必要があります2
)tail -f ../logs/mongologs.txt
。このスクリプトはバックグラウンドで開始でき、ファイル内のデータベースに対するすべての操作をログに記録します。system.profileコレクションの調整可能なカーソルのコードはnodejsにあります。MyDbのすべてのコレクションで発生するクエリとともにすべての操作をログに記録します。
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const fs = require('fs');
const file = '../logs/mongologs'
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'MyDb';
//Mongodb connection
MongoClient.connect(url, function (err, client) {
assert.equal(null, err);
const db = client.db(dbName);
listen(db, {})
});
function listen(db, conditions) {
var filter = { ns: { $ne: 'MyDb.system.profile' } }; //filter for query
//e.g. if we need to log only insert queries, use {op:'insert'}
//e.g. if we need to log operation on only 'MyCollection' collection, use {ns: 'MyDb.MyCollection'}
//we can give a lot of filters, print and check the 'document' variable below
// set MongoDB cursor options
var cursorOptions = {
tailable: true,
awaitdata: true,
numberOfRetries: -1
};
// create stream and listen
var stream = db.collection('system.profile').find(filter, cursorOptions).stream();
// call the callback
stream.on('data', function (document) {
//this will run on every operation/query done on our database
//print 'document' to check the keys based on which we can filter
//delete data which we dont need in our log file
delete document.execStats;
delete document.keysExamined;
//-----
//-----
//append the log generated in our log file which can be tailed from command line
fs.appendFile(file, JSON.stringify(document) + '\n', function (err) {
if (err) (console.log('err'))
})
});
}
pymongoを使用したPythonでの調整可能なカーソルについては、MyCollectionをフィルタリングし、操作のみを挿入する次のコードを参照してください。
import pymongo
import time
client = pymongo.MongoClient()
oplog = client.MyDb.system.profile
first = oplog.find().sort('$natural', pymongo.ASCENDING).limit(-1).next()
ts = first['ts']
while True:
cursor = oplog.find({'ts': {'$gt': ts}, 'ns': 'MyDb.MyCollection', 'op': 'insert'},
cursor_type=pymongo.CursorType.TAILABLE_AWAIT)
while cursor.alive:
for doc in cursor:
ts = doc['ts']
print(doc)
print('\n')
time.sleep(1)
注:テール可能カーソルは、上限のあるコレクションでのみ機能します。コレクションの操作を直接ログに記録するために使用することはできません。代わりに、フィルターを使用してください。'ns': 'MyDb.MyCollection'
注:上記のnodejsとpythonのコードは、一部のユーザーにとってあまり役に立たない場合があることを理解しています。参照用のコードを提供しました。
このリンクを使用して、言語/ドライバーの選択で調整可能なカーソルのドキュメントを検索します。Mongodbドライバー
このログローテーションの後に追加した別の機能。
このパッケージを試して、すべてのクエリを(oplog操作なしで)調整します:https ://www.npmjs.com/package/mongo-tail-queries
(免責事項:私はこのニーズのためにこのパッケージを正確に作成しました)