สิ่งนี้ถูกถามมานานแล้ว แต่สิ่งนี้อาจยังช่วยใครซักคน:
MongoDB Profiler บันทึกคำสั่งทั้งหมดในคอลเลกชันที่ปกคลุมsystem.profile ดูสิ่งนี้: profiler ฐานข้อมูล
- เริ่มต้นอินสแตนซ์ mongod ด้วย
--profile=2
ตัวเลือกที่เปิดใช้งานการบันทึกแบบสอบถามทั้งหมด
หรือถ้าอินสแตนซ์ mongod กำลังทำงานอยู่จาก mongoshell ให้รันdb.setProfilingLevel(2)
หลังจากเลือกฐานข้อมูล (สามารถตรวจสอบได้โดย db.getProfilingLevel()
ซึ่งควรกลับมา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นี้
mongod -vv
ทำงานให้ฉัน