MongoDB บันทึกการสืบค้นทั้งหมด


169

คำถามนั้นง่ายเหมือนคำถามทั่วไป ... คุณจะบันทึกคำค้นหาทั้งหมดในไฟล์บันทึก "หาง" ใน mongodb ได้อย่างไร?

ฉันเหนื่อย:

  • การตั้งค่าระดับการทำโปรไฟล์
  • การตั้งค่าพารามิเตอร์ ms ช้าเริ่มต้น
  • mongod พร้อมกับตัวเลือก -vv

/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

2
ไม่ดีขึ้นเนื่องจากคำถามถามหาไฟล์บันทึกที่ใช้งานได้ แต่มีประโยชน์แน่นอนในกรณีที่คุณไม่สามารถเข้าถึงไฟล์บันทึกได้เพียงเชลล์ mongo เช่นเดียวกับที่นำมาให้ฉันที่นี่ :)
inolasco

11
ฉันพยายามตั้งค่าระดับการทำโปรไฟล์เป็น 2 แต่ฉันยังจำเป็นต้องตั้งค่าพารามิเตอร์ที่สองเป็น -1 เช่นdb.setProfilingLevel(2,-1)
andresigualada

4
สำหรับผู้ที่สนใจว่าจะไปที่ไหนบันทึกรัฐ doc: mongod เขียนเอาต์พุตของ profiler ฐานข้อมูลไปยังsystem.profileคอลเลกชัน
totymedli

5
db.system.profile.find().pretty()ไม่ให้อะไรกับฉันเลย
node_saini

84

ฉันสิ้นสุดการแก้ปัญหาโดยเริ่ม mongod เช่นนี้ (ใช้ค้อนทุบและน่าเกลียดใช่ ... แต่ใช้งานได้กับสภาพแวดล้อมการพัฒนา):

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

สิ่งนี้ช่วยให้การทำโปรไฟล์และตั้งค่าขีด จำกัด สำหรับ "คิวรีช้า" เป็น 1ms ทำให้คิวรีทั้งหมดถูกบันทึกเป็น "คิวรีช้า" ลงในไฟล์:

/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=1และslowms=1บรรทัดใน/etc/mongodb.confหรือไม่
Andrew Magee

ฉันหา /var/log/mongodb/mongodb.log ไม่ได้ แต่มันเข้าสู่คอนโซลซึ่งฉันต้องการ ขอบคุณ
auhuman

4
คุณก็สามารถเพิ่ม--profile=2การ/etc/mongodb.confตามเอกสาร Mongo อย่างเป็นทางการใด ๆ การดำเนินงานทั้งหมดจะถูกบันทึกไว้
toske

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 ลงในบันทึกของตนเสมอ นี่คือระดับ profiler เริ่มต้น
  • ระดับ 1 - รวบรวมข้อมูลการทำโปรไฟล์สำหรับการทำงานที่ช้าเท่านั้น โดยค่าเริ่มต้นการดำเนินการช้าจะช้ากว่า 100 มิลลิวินาที คุณสามารถแก้ไขขีด จำกัด สำหรับการดำเนินการ“ ช้า” ด้วยตัวเลือกรันไทม์ slowOpThresholdMs หรือคำสั่ง setParameter ดูส่วนระบุเกณฑ์สำหรับการดำเนินการที่ช้าสำหรับข้อมูลเพิ่มเติม
  • ระดับ 2 - รวบรวมข้อมูลการทำโปรไฟล์สำหรับการดำเนินการฐานข้อมูลทั้งหมด

หากต้องการดูระดับฐานข้อมูลที่ใช้งานอยู่ให้ใช้

db.getProfilingLevel()

และเพื่อดูสถานะ

db.getProfilingStatus()

หากต้องการเปลี่ยนสถานะการทำโปรไฟล์ให้ใช้คำสั่ง

db.setProfilingLevel(level, milliseconds)

โดยที่levelอ้างถึงระดับการทำโปรไฟล์และmillisecondsเป็น ms ของช่วงเวลาที่แบบสอบถามจำเป็นต้องถูกบันทึก หากต้องการปิดการบันทึกให้ใช้

db.setProfilingLevel(0)

แบบสอบถามที่จะค้นหาในคอลเลกชันโปรไฟล์ระบบสำหรับคิวรีทั้งหมดที่ใช้เวลานานกว่าหนึ่งวินาทีซึ่งเรียงลำดับโดยการประทับเวลาจากมากไปน้อยจะเป็น

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )

1
ตามเอกสารประกอบLoglevel 0ไม่ได้หมายความว่า "ไม่มีการบันทึก" แต่บันทึกการสืบค้นที่ช้า: "ผู้สร้างโปรไฟล์ปิดไม่รวบรวมข้อมูลใด ๆ mongod มักจะเขียนการดำเนินการนานกว่าธรณีประตู slowOpThresholdMs ลงในบันทึกของมันเสมอ" src: docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/ …
kayn

23

ฉันทำเครื่องมือบรรทัดคำสั่งเพื่อเปิดใช้งานกิจกรรม Profiler และดูบันทึกใน"หาง" สามารถทาง: "mongotail"

แต่ฟีเจอร์ที่น่าสนใจ (เช่นtail) ก็คือการเห็นการเปลี่ยนแปลงใน"เรียลไทม์"ด้วย-fตัวเลือกและบางครั้งกรองผลลัพธ์ด้วยgrepเพื่อค้นหาการดำเนินการเฉพาะ

ดูเอกสารและคำแนะนำในการติดตั้งใน: https://github.com/mrsarm/mongotail


2
นี่คือการตอบสนองที่สมบูรณ์แบบที่สุดสำหรับ OP ESP เกี่ยวกับความต้องการของ 'tail-can'
ลุค W

11

db.setProfilingLevel(2)เมื่อระดับโปรไฟล์จะถูกตั้งค่าการใช้

คำสั่งด้านล่างจะพิมพ์แบบสอบถามดำเนินการล่าสุด
คุณสามารถเปลี่ยนขีด จำกัด (5) และดูข้อความค้นหาน้อยลง
$ nin - จะกรองการสืบค้นโปรไฟล์และดัชนี
นอกจากนี้ให้ใช้การประมาณการเคียวรี {'เคียวรี': 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

ข้อมูลตัวสร้างโปรไฟล์ถูกเขียนลงในคอลเลกชันในฐานข้อมูลของคุณไม่ใช่ไปยังไฟล์ ดูhttp://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

ฉันอยากจะแนะนำให้ใช้บริการMMSของ 10gen และใช้ข้อมูลโปรไฟล์ผู้พัฒนาฟีดที่นั่นซึ่งคุณสามารถกรองและเรียงลำดับใน UI ได้


1
ใช่หลังจากเปิดใช้งานการทำโปรไฟล์ระดับ 2 แล้วจะมีการเพิ่มคอลเล็กชันในฐานข้อมูล อย่างไรก็ตามการโหลด gui ใหม่หรือรันคำสั่งทุกครั้งที่ฉันทำการดีบักคือ PITA ในตอนท้ายของวัน ... นั่นเป็นเหตุผลว่าทำไมฉันต้องการไฟล์บันทึกที่ใช้งานได้
João Rocha da Silva

4

ฉันคิดว่าในขณะที่ไม่หรูหราoplog สามารถนำไปใช้บางส่วนเพื่อจุดประสงค์นี้: มันบันทึกการเขียนทั้งหมด - แต่ไม่ใช่การอ่าน ...

คุณต้องเปิดใช้งาน replicatoon ถ้าฉันพูดถูก ข้อมูลมาจากคำตอบนี้จากคำถามนี้: วิธีการฟังการเปลี่ยนแปลงคอลเลกชัน MongoDB อย่างไร


4

การตั้งค่า profilinglevel เป็น 2 เป็นอีกตัวเลือกในการบันทึกการสืบค้นทั้งหมด


3

ฉันแนะนำให้เช็คเอาท์ mongosniff เครื่องมือนี้สามารถทำทุกสิ่งที่คุณต้องการและอีกมากมาย โดยเฉพาะอย่างยิ่งสามารถช่วยวินิจฉัยปัญหาเกี่ยวกับระบบ mongo ขนาดใหญ่และวิธีสอบถามข้อมูลที่มีการกำหนดเส้นทางและที่มาของข้อมูลเนื่องจากทำงานได้โดยการฟังอินเตอร์เฟสเครือข่ายของคุณสำหรับการสื่อสารที่เกี่ยวข้องกับ mongo ทั้งหมด

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


ตามหน้านั้นมันใช้งานได้ใน UNIX enviros เท่านั้นและฉันไม่มีมันใน bin dir ของฉันใน windows มีหน้าต่างแนะนำอะไรบ้าง?
เผยแพร่เมื่อ

คุณกำลังทำงานบนเซิร์ฟเวอร์ windows ระยะไกล (เมฆสีฟ้า ฯลฯ ) หรือในเครื่องคอมพิวเตอร์ของคุณ? ถ้ามันทั้งหมด wireshark ท้องถิ่นจะมากกว่าเพียงพอ หากต้องการติดตั้งบน windows คุณจะต้องสร้าง mongosniff.exe ซึ่งเป็นบิตที่ไม่มีเอกสาร คุณทำตามคำแนะนำของ linux แต่คุณต้องติดตั้ง winpcap เวอร์ชันพัฒนา
Daniel Williams

ขอบคุณสำหรับการตอบกลับ. ฉันลงเอยด้วยการได้รับข้อมูลที่ฉันต้องการจาก mongo profiler แต่ฉันจะเก็บ wireshark ไว้ในกระเป๋าของฉันหากมีสิ่งที่ร้ายแรงเกิดขึ้นอีกครั้ง
เผยแพร่เมื่อ

1

ฉันเขียนสคริปต์ที่จะพิมพ์บันทึก system.profile แบบเรียลไทม์เมื่อมีการสอบถามคุณต้องเปิดใช้งานการบันทึกก่อนตามที่ระบุในคำตอบอื่น ๆ ฉันต้องการสิ่งนี้เพราะฉันใช้ระบบย่อย Windows สำหรับ Linux ซึ่งส่วนท้ายยังไม่ทำงาน

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



1

สิ่งนี้ถูกถามมานานแล้ว แต่สิ่งนี้อาจยังช่วยใครซักคน:

MongoDB Profiler บันทึกคำสั่งทั้งหมดในคอลเลกชันที่ปกคลุมsystem.profile ดูสิ่งนี้: profiler ฐานข้อมูล

  1. เริ่มต้นอินสแตนซ์ mongod ด้วย--profile=2ตัวเลือกที่เปิดใช้งานการบันทึกแบบสอบถามทั้งหมด หรือถ้าอินสแตนซ์ 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 อ้างอิงรหัสต่อไปนี้ซึ่งกรองสำหรับ 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

คุณสมบัติอื่นที่ฉันได้เพิ่มหลังจากlogrotateนี้


0

ลองใช้แพคเกจนี้เพื่อปรับแต่งข้อความค้นหาทั้งหมด (โดยไม่ต้องใช้งาน oplog): https://www.npmjs.com/package/mongo-tail-queries

(คำเตือน: ฉันเขียนแพคเกจนี้ว่าตรงกับความต้องการนี้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.