MongoDB mencatat semua permintaan

169

Pertanyaannya mendasar seperti sederhana ... Bagaimana Anda mencatat semua pertanyaan dalam file log "tail" di mongodb?

Saya telah mencoba:

  • mengatur level profiling
  • mengatur mulai lambatnya parameter ms
  • mongod dengan opsi -vv

/Var/log/mongodb/mongodb.log terus menunjukkan jumlah koneksi aktif saat ini ...

João Rocha da Silva
sumber
mongod -vvbekerja untuk saya
fguillen

Jawaban:

259

Anda dapat mencatat semua pertanyaan:

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

Sumber: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

db.setProfilingLevel(2) berarti "catat semua operasi".

Kristóf Dombi
sumber
3
Sekilas, sepertinya ini adalah jawaban yang lebih baik daripada jawaban yang diterima.
Ehtesh Choudhury
2
Tidak lebih baik, mengingat pertanyaan menanyakan file log yang tersedia, tetapi pasti berguna, dalam kasus di mana Anda tidak memiliki akses ke file log, hanya shell mongo, seperti yang membawa saya ke sini :)
inolasco
11
Saya mencoba mengatur level profil ke 2 tetapi saya juga perlu mengatur parameter kedua menjadi -1, sepertidb.setProfilingLevel(2,-1)
andresigualada
4
Bagi mereka yang tertarik kemana log pergi, doc menyatakan: mongod menulis output dari database profiler ke system.profilekoleksi.
totymedli
5
db.system.profile.find().pretty()tidak memberikan apa pun untuk saya
node_saini
84

Saya akhirnya menyelesaikan ini dengan memulai mongod seperti ini (dipalu dan jelek, ya ... tetapi bekerja untuk lingkungan pengembangan):

mongod --profile=1 --slowms=1 &

Ini memungkinkan pembuatan profil dan menetapkan ambang untuk "permintaan lambat" sebagai 1 ms, menyebabkan semua permintaan dicatat sebagai "permintaan lambat" ke file:

/var/log/mongodb/mongodb.log

Sekarang saya mendapatkan keluaran log kontinu menggunakan perintah:

tail -f /var/log/mongodb/mongodb.log

Contoh 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
João Rocha da Silva
sumber
6
Haruskah ini setara dengan menambahkan profile=1dan slowms=1baris dalam /etc/mongodb.conf?
Andrew Magee
Saya tidak dapat menemukan / var / log / mongodb / mongodb.log tapi itu masuk di konsol, yang saya butuhkan. Terima kasih
auhuman
4
Anda bisa menambahkan --profile=2untuk /etc/mongodb.confsesuai dengan dokumen Mongo resmi, setiap semua operasi akan login.
toske
1
@auhuman Tempat menulis perintah "tail -f /var/log/mongodb/mongodb.log" ??
Half Blood Prince
5
Tidak perlu restart Anda cukup menggunakan db.setProfilingLevel(level,slowms). Untuk misalnya: db.setProfilingLevel(2,1)akan menetapkan level menjadi 2 dan memperlambat ambang kueri menjadi 1ms.
Abhishek Gupta
25

MongoDBmemiliki fitur profil yang canggih. Pencatatan terjadi dalam system.profilekoleksi. Log dapat dilihat dari:

db.system.profile.find()

Ada 3 level logging ( sumber ):

  • Level 0 - profiler tidak aktif, tidak mengumpulkan data apa pun. mongod selalu menulis operasi lebih lama dari ambang slowOpThresholdMs ke log-nya. Ini adalah level profiler default.
  • Level 1 - mengumpulkan data profil hanya untuk operasi lambat. Secara default, operasi lambat adalah yang lebih lambat dari 100 milidetik. Anda dapat memodifikasi ambang untuk operasi "lambat" dengan opsi runtime slowOpThresholdMs atau perintah setParameter. Lihat bagian Tentukan Batas untuk Operasi Lambat untuk informasi lebih lanjut.
  • Level 2 - mengumpulkan data profil untuk semua operasi basis data.

Untuk melihat tingkat profil yang digunakan basis data, gunakan

db.getProfilingLevel()

dan untuk melihat statusnya

db.getProfilingStatus()

Untuk mengubah status pembuatan profil, gunakan perintah

db.setProfilingLevel(level, milliseconds)

Di mana levelmengacu pada tingkat profil dan millisecondsmerupakan ms yang durasi kueri perlu dicatat. Untuk mematikan pencatatan, gunakan

db.setProfilingLevel(0)

Kueri untuk melihat dalam kumpulan profil sistem untuk semua kueri yang membutuhkan waktu lebih dari satu detik, dipesan oleh timestamp turun akan menjadi

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
Zameer
sumber
1
Menurut dokumentasi, loglevel 0 tidak tidak berarti "tidak ada penebangan" tapi log query lambat: "profiler dimatikan, tidak mengumpulkan data mongod selalu menulis operasi lebih lama dari ambang slowOpThresholdMs untuk log-nya." src: docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/…
kayn
23

Saya membuat alat baris perintah untuk mengaktifkan aktivitas profiler dan melihat log dengan cara "tail" : "mongotail" .

Tetapi fitur yang lebih menarik (juga suka tail) adalah untuk melihat perubahan "real time" dengan -fopsi, dan sesekali menyaring hasilnya dengangrep untuk menemukan operasi tertentu.

Lihat dokumentasi dan petunjuk pemasangan di: https://github.com/mrsarm/mongotail

Mariano Ruiz
sumber
2
ini adalah respons paling lengkap terhadap OP. esp. tentang persyaratan 'ekor-mampu'.
Luke W
11

Setelah tingkat pembuatan profil diatur menggunakan db.setProfilingLevel(2).

Perintah di bawah ini akan mencetak kueri yang dieksekusi terakhir.
Anda dapat mengubah batas (5) juga untuk melihat kueri lebih sedikit / lebih.
$ nin - akan memfilter profil dan kueri indeks
Juga, gunakan proyeksi kueri {'kueri': 1} untuk hanya melihat bidang permintaan

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
} 
).limit(5).sort( { ts : -1 } ).pretty()

Log dengan proyeksi permintaan saja

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
Faiz Mohamed Haneef
sumber
10

Jika Anda ingin kueri dicatat ke file log mongodb, Anda harus mengatur level log dan profil, seperti misalnya:

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

(lihat https://docs.mongodb.com/manual/reference/method/db.setLogLevel )

Pengaturan hanya profiling tidak akan memiliki kueri login ke file, jadi Anda hanya bisa mendapatkannya dari

db.system.profile.find().pretty()
DariusNica
sumber
7

Data profiler ditulis ke kumpulan di DB Anda, bukan ke file. Lihat http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

Saya akan merekomendasikan menggunakan layanan MMS 10gen , dan memberi makan data profiler pengembangan di sana, di mana Anda dapat memfilter dan mengurutkannya di UI.

Hans N. Hjort
sumber
1
Ya, setelah mengaktifkan profil level 2, koleksi ditambahkan ke database. Namun, harus memuat ulang gui atau menjalankan perintah setiap kali saya melakukan debugging adalah PITA di akhir hari ... Itulah sebabnya saya ingin file log yang tersedia.
João Rocha da Silva
4

Menetapkan profilinglevel ke 2 adalah opsi lain untuk mencatat semua permintaan.

Shnkc
sumber
3

Saya sarankan memeriksa mongosniff. Alat kaleng ini dapat melakukan semua yang Anda inginkan dan banyak lagi. Terutama itu dapat membantu mendiagnosis masalah dengan sistem mongo skala yang lebih besar dan bagaimana pertanyaan dialihkan dan dari mana mereka berasal karena ia bekerja dengan mendengarkan antarmuka jaringan Anda untuk semua komunikasi terkait mongo.

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

Daniel Williams
sumber
Menurut halaman itu, itu hanya berfungsi di UNIX enviros, dan saya tidak memilikinya di tempat sampah saya di windows. Adakah yang disarankan windows equiv?
disebarkan
Apakah Anda menjalankan server windows jarak jauh (awan biru, dll) atau secara lokal di komputer Anda? Jika itu semua wireshark lokal akan lebih dari cukup. Untuk menginstalnya di windows Anda harus membangun mongosniff.exe yang sedikit tidak berdokumen. Anda mengikuti instruksi linux tetapi Anda harus menginstal versi pengembangan winpcap.
Daniel Williams
Terima kasih balasannya. Saya akhirnya bisa mendapatkan informasi yang saya butuhkan dari profiler mongo, tetapi saya akan menyimpan wireshark di saku saya jika sesuatu yang lebih serius muncul lagi.
diperbanyak
1

Saya menulis sebuah skrip yang akan mencetak log system.profile secara real time ketika queri masuk. Anda harus mengaktifkan logging terlebih dahulu seperti yang dinyatakan dalam jawaban lain. Saya membutuhkan ini karena saya menggunakan Windows Subsystem untuk Linux, yang ekornya masih tidak berfungsi.

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

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

Kemudian

db.adminCommand( { getLog : "global" } )
HareesH P
sumber
5
Selamat Datang di Stack Overflow! Sementara kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda.
Shree
1

Ini sudah lama ditanyakan tetapi ini mungkin masih membantu seseorang:

Profiler MongoDB mencatat semua kueri dalam sistem pengumpulan capped.profile . Lihat ini: profiler basis data

  1. Mulai instance mongod dengan --profile=2opsi yang memungkinkan logging semua permintaan ATAU jika instance mongod sudah berjalan, dari mongoshell, jalankan db.setProfilingLevel(2)setelah memilih database. (dapat diverifikasi oleh db.getProfilingLevel(), yang harus dikembalikan2 )
  2. Setelah ini, saya telah membuat skrip yang menggunakan kursor mongodb yang tersedia untuk mengekor system.profile ini mengumpulkan dan menulis entri dalam file. Untuk melihat log saya hanya perlu ekor itu: tail -f ../logs/mongologs.txt. Skrip ini dapat dimulai di latar belakang dan akan mencatat semua operasi pada db dalam file.

Kode saya untuk kursor yang tersedia untuk koleksi system.profile ada di nodejs; itu mencatat semua operasi bersama dengan kueri yang terjadi di setiap koleksi 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'))
    })

});

}

Untuk kursor yang tersedia di python menggunakan pymongo, lihat kode berikut yang memfilter untuk MyCollection dan hanya memasukkan operasi:

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)

Catatan: Kursor yang tersedia hanya berfungsi dengan koleksi yang dibatasi. Itu tidak dapat digunakan untuk mencatat operasi pada koleksi secara langsung, sebagai gantinya gunakan filter:'ns': 'MyDb.MyCollection'

Catatan: Saya mengerti bahwa nodejs dan kode python di atas mungkin tidak banyak membantu bagi sebagian orang. Saya baru saja memberikan kode untuk referensi.

Gunakan tautan ini untuk menemukan dokumentasi untuk kursor yang tersedia di Bahasa / Driver pilihan Mongodb Drivers Anda

Fitur lain yang saya tambahkan setelah logrotate ini .

Ankit
sumber