190

質問は単純であると同時に基本的なものです...mongodbの「テール」可能なログファイルにすべてのクエリをどのように記録しますか?

私が試してみました:

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

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

4

16 に答える 16

288

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

$ 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)「すべての操作をログに記録する」という意味です。

于 2014-02-12T11:01:12.347 に答える
88

私はこのように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
于 2013-03-04T15:07:03.473 に答える
36

そのグーグルの最初の答えのために...
バージョン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/

于 2015-04-24T14:03:52.017 に答える
28

MongoDBプロファイリングの洗練された機能があります。ロギングはsystem.profileコレクションで行われます。ログは以下から見ることができます:

db.system.profile.find()

3つのロギングレベルがあります(ソース):

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

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

db.getProfilingLevel()

ステータスを確認するには

db.getProfilingStatus()

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

db.setProfilingLevel(level, milliseconds)

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

db.setProfilingLevel(0)

タイムスタンプの降順で1秒以上かかったすべてのクエリについて、システムプロファイルコレクションを検索するクエリは次のようになります。

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
于 2016-09-05T11:17:30.360 に答える
22

プロファイラーアクティビティをアクティブにして、 「テール」可能な方法でログを表示するコマンドラインツールを作成しました-> 「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のドキュメントとインストール手順を参照してください

于 2015-02-24T19:17:36.183 に答える
13

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

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

https://docs.mongodb.com/manual/reference/method/db.setLogLevelを参照してください)

プロファイリングのみを設定すると、クエリはファイルに記録されないため、次の場所からのみ取得できます。

db.system.profile.find().pretty()
于 2019-01-21T22:24:39.430 に答える
11

を使用してプロファイリングレベルを設定したら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()
于 2015-10-23T16:11:38.883 に答える
7

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

10genのMMSサービスを使用し、そこに開発プロファイラーデータをフィードして、UIでフィルター処理して並べ替えることをお勧めします。

于 2013-03-04T14:56:40.290 に答える
4

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

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

于 2013-03-04T14:57:46.220 に答える
4

profilinglevelを2に設定することは、すべてのクエリをログに記録するためのもう1つのオプションです。

于 2013-11-27T15:58:01.433 に答える
4
db.setProfilingLevel(2,-1)

これはうまくいきました!すべてのクエリ情報をmongodログファイルに記録しました

于 2021-01-06T16:59:24.277 に答える
3

mongosniffをチェックすることをお勧めします。このツールは、必要なことすべてを実行できます。特に、大規模なmongoシステムの問題や、mongoに関連するすべての通信についてネットワークインターフェイスをリッスンすることで機能するため、クエリがどのようにルーティングされ、どこから送信されているかを診断するのに役立ちます。

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

于 2013-12-17T20:33:20.120 に答える
1

クエリが着信すると、system.profileログをリアルタイムで出力するスクリプトを作成しました。他の回答に記載されているように、最初にログを有効にする必要があります。Linux用のWindowsSubsystemを使用しているので、これが必要でしたが、テールはまだ機能しません。

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

于 2016-12-14T14:53:18.800 に答える
1
db.adminCommand( { getLog: "*" } )

それで

db.adminCommand( { getLog : "global" } )
于 2019-05-24T06:42:45.063 に答える
1

これはずっと前に尋ねられましたが、これはまだ誰かを助けるかもしれません:

MongoDBプロファイラーは、上限付きコレクションsystem.profile内のすべてのクエリをログに記録します。これを参照してください:データベースプロファイラー

  1. --profile=2すべてのクエリのログ記録を有効にするオプションを使用 してmongodインスタンスを起動するか、mongodインスタンスがすでに実行されている場合は、mongoshellから、データベースを選択した後に実行db.setProfilingLevel(2)ます。(によって確認できます db.getProfilingLevel()。これはを返す必要があります2
  2. この後、mongodbの調整可能なカーソルを使用してこのsystem.profileコレクションを調整し、エントリをファイルに書き込むスクリプトを作成しました。ログを表示するには、それを調整する必要があります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ドライバー

このログローテーションの後に追加した別の機能。

于 2019-09-09T11:27:26.180 に答える
0

このパッケージを試して、すべてのクエリを(oplog操作なしで)調整します:https ://www.npmjs.com/package/mongo-tail-queries

(免責事項:私はこのニーズのためにこのパッケージを正確に作成しました)

于 2018-12-17T18:25:58.280 に答える