質問はシンプルであるのと同じくらい基本的です... mongodbの「テール」可能なログファイルにすべてのクエリをどのように記録しますか?
私が試してみました:
- プロファイリングレベルの設定
- 遅いmsパラメータを設定する
- -vvオプションを指定したmongod
/var/log/mongodb/mongodb.logはアクティブな接続の現在の数だけを表示し続けます...
質問はシンプルであるのと同じくらい基本的です... mongodbの「テール」可能なログファイルにすべてのクエリをどのように記録しますか?
私が試してみました:
/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)
「すべての操作をログに記録」を意味します。
db.setProfilingLevel(2,-1)
system.profile
コレクションに書き込みます。
db.system.profile.find().pretty()
私には何も与えない
私はこのように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
profile=1
とslowms=1
行と同等/etc/mongodb.conf
ですか?
--profile=2
するだけ/etc/mongodb.conf
で、すべての操作がログに記録されます。
db.setProfilingLevel(level,slowms)
。たとえば、db.setProfilingLevel(2,1)
レベルを2に、スロークエリのしきい値を1ミリ秒に設定します。
そのグーグルの最初の答えだから...
バージョン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」。
しかし、より興味深い機能(も同様tail
)は、オプションを使用して「リアルタイム」での変更を確認し、特定の操作を見つけるために-f
結果を時々フィルタリングすることgrep
です。
https://github.com/mrsarm/mongotailのドキュメントとインストール手順を参照してください。
一度プロファイリングレベルを使用して設定されています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()
クエリをmongodbログファイルに記録する場合は、次のように、ログレベルとプロファイリングの両方を設定する必要があります。
db.setLogLevel(1)
db.setProfilingLevel(2)
(https://docs.mongodb.com/manual/reference/method/db.setLogLevelを参照してください)
プロファイリングのみを設定すると、クエリがファイルに記録されないため、取得できるのは
db.system.profile.find().pretty()
プロファイラーデータは、ファイルではなく、DBのコレクションに書き込まれます。http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/を参照してください
10genのMMSサービスを使用し、そこに開発プロファイラーデータをフィードすることをお勧めします。ここで、UIでフィルタリングおよびソートできます。
oplog はエレガントではありませんが、この目的のために部分的に使用できると思います。すべての書き込みをログに記録しますが、読み取りはログに記録しません...
私が正しい場合は、replicatoonを有効にする必要があります。情報は、この質問のこの回答からのものです。MongoDBコレクションへの変更をリッスンする方法は?
mongosniffをチェックすることをお勧めします。この缶ツールはあなたが望むすべてを行うことができます。特に、大規模なモンゴシステムの問題と、クエリのルーティング方法とクエリの送信元の問題の診断に役立ちます。これは、モンゴ関連のすべての通信でネットワークインターフェイスをリッスンすることによって機能するためです。
クエリが入力されるとリアルタイムでsystem.profileログを出力するスクリプトを作成しました。他の回答で述べられているように、まずログを有効にする必要があります。LinuxのWindowsサブシステムを使用しているため、これが必要でしたが、これでもテールが機能しません。
これはずっと前に尋ねられましたが、これはまだ誰かを助けるかもしれません:
MongoDBプロファイラーは、すべてのクエリを上限付きコレクションsystem.profileに記録します。これを見てください:データベースプロファイラー
--profile=2
すべてのクエリをログに記録する可能オプション
ORのmongodインスタンスがすでに、mongoshellから、実行実行されている場合はdb.setProfilingLevel(2)
、データベースを選択した後に。(それはによって確認できますが db.getProfilingLevel()
、返されるはずです2
)tail -f ../logs/mongologs.txt
。このスクリプトはバックグラウンドで開始でき、dbに対するすべての操作をファイルに記録します。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)
注:Tailableカーソルは、上限のあるコレクションでのみ機能します。コレクションの操作を直接ログに記録するために使用することはできません。代わりにフィルターを使用してください:'ns': 'MyDb.MyCollection'
注:上記のnodejsとpythonのコードは、一部の人にとってはあまり役に立たない場合があることを理解しています。参照用のコードを提供しました。
このリンクを使用して、言語/ドライバーの選択で調整可能なカーソルのドキュメントを検索してくださいMongodb Drivers
このlogrotateの後に追加した別の機能。
mongod -vv
私のために働いた