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


169

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

私が試してみました:

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

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


mongod -vv私のために働いた
fguillen

回答:


259

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

$ 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
一見すると、これは受け入れられた回答よりも良い回答であるように見えます。
Ehtesh Choudhury 2014

2
質問は調整可能なログファイルを要求することを考えると、あまり良くありませんが、ログファイルにアクセスできない場合、私をここに連れてきたようなmongoシェルのみが確実に役立ちます:)
inolasco

11
プロファイリングレベルを2に設定してみましたが、次のように2番目のパラメーターを-1に設定する必要もありますdb.setProfilingLevel(2,-1)
andresigualada

4
ログの保存場所に関心がある場合は、ドキュメントに次のように記載されています。mongodはデータベースプロファイラーの出力をsystem.profileコレクションに書き込みます。
totymedli 2016年

5
db.system.profile.find().pretty()私には何も与えない
node_saini 2017年

84

私はこのように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

6
これは、の追加profile=1slowms=1行と同等/etc/mongodb.confですか?
Andrew Magee 2014

/var/log/mongodb/mongodb.logは見つかりませんでしたが、必要なコンソールにログインしていました。ありがとう
auhuman

4
Mongoの公式ドキュメントに従って追加--profile=2するだけ/etc/mongodb.confで、すべての操作がログに記録されます。
toske 2015

1
@auhuman「tail -f /var/log/mongodb/mongodb.log」コマンドはどこに書けばいいですか?
Half Blood Prince

5
再起動する必要はなく、単に使用できますdb.setProfilingLevel(level,slowms)。たとえば、db.setProfilingLevel(2,1)レベルを2に、スロークエリのしきい値を1ミリ秒に設定します。
Abhishek Gupta


25

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 } )

1
ドキュメントによると、ログレベル0は「ロギングなし」を意味するのではなく、遅いクエリをログに記録します。SRC:docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/...
KAYN

23

コマンドラインツールを作成してプロファイラーアクティビティをアクティブにし、ログを「テール」可能な方法で表示します:「mongotail」

しかし、より興味深い機能(も同様tail)は、オプションを使用して「リアルタイム」での変更を確認し、特定の操作を見つけるために-f結果を時々フィルタリングすることgrepです。

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


2
これはOPに対する最も完全な応答です。特に 「テール可能」要件について。
ルークW

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()

10

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

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

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

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

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

7

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

10genのMMSサービスを使用し、そこに開発プロファイラーデータをフィードすることをお勧めします。ここで、UIでフィルタリングおよびソートできます。


1
ええ、レベル2プロファイリングをアクティブにした後、コレクションがデータベースに追加されます。ただし、デバッグを実行するたびにGUIを再ロードしたりコマンドを実行したりする必要があるのは、結局のところPITAです...そのため、カスタマイズ可能なログファイルが必要でした。
ジョアン・ロシャダ・シルヴァ


4

プロファイルレベルを2に設定することは、すべてのクエリをログに記録するもう1つのオプションです。


3

mongosniffをチェックすることをお勧めします。この缶ツールはあなたが望むすべてを行うことができます。特に、大規模なモンゴシステムの問題と、クエリのルーティング方法とクエリの送信元の問題の診断に役立ちます。これは、モンゴ関連のすべての通信でネットワークインターフェイスをリッスンすることによって機能するためです。

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


そのページによると、それはUNIX環境でのみ機能し、Windowsのbin dirにはありません。推奨される同等のウィンドウはありますか?
伝播

リモートのWindowsサーバー(azureクラウドなど)で実行していますか、それともローカルでPCで実行していますか?それがすべてローカルであれば、wiresharkで十分です。これをWindowsにインストールするには、少しドキュメント化されていないmongosniff.exeをビルドする必要があります。Linuxの指示に従いますが、開発版のwinpcapをインストールする必要があります。
ダニエルウィリアムズ

返信いただきありがとうございます。結局、mongoプロファイラーから必要な情報を取得できるようになりましたが、さらに深刻な問題が発生した場合は、wiresharkをポケットに入れておきます。
伝播

1

クエリが入力されるとリアルタイムでsystem.profileログを出力するスクリプトを作成しました。他の回答で述べられているように、まずログを有効にする必要があります。LinuxのWindowsサブシステムを使用しているため、これが必要でしたが、これでもテールが機能しません。

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


1
db.adminCommand( { getLog: "*" } )

その後

db.adminCommand( { getLog : "global" } )

5
Stack Overflowへようこそ!このコードは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。
Shree

1

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

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

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


0

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

(免責事項:私はこの必要性のためにこのパッケージを正確に書きました)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.