Điều này đã được hỏi từ lâu nhưng điều này vẫn có thể giúp ai đó:
Trình biên dịch MongoDB ghi lại tất cả các truy vấn trong bộ sưu tập cap.profile . Xem này: cơ sở dữ liệu hồ sơ
- Bắt đầu cá thể mongod với
--profile=2
tùy chọn cho phép ghi nhật ký tất cả các truy vấn
HOẶC nếu các phiên bản mongod đang chạy, từ mongoshell, chạy db.setProfilingLevel(2)
sau khi chọn cơ sở dữ liệu. (nó có thể được xác minh bởi db.getProfilingLevel()
, cái nào sẽ trả về 2
)
- Sau này, tôi đã tạo một tập lệnh sử dụng con trỏ có sẵn của mongodb để theo đuôi bộ sưu tập system.profile này và viết các mục trong một tệp. Để xem nhật ký tôi chỉ cần theo đuôi nó :
tail -f ../logs/mongologs.txt
. Kịch bản này có thể được bắt đầu trong nền và nó sẽ ghi lại tất cả các hoạt động trên db trong tệp.
Mã của tôi cho con trỏ có sẵn cho bộ sưu tập system.profile nằm trong nodejs; nó ghi nhật ký tất cả các hoạt động cùng với các truy vấn xảy ra trong mọi bộ sưu tập của 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'))
})
});
}
Đối với con trỏ có sẵn trong python bằng pymongo, hãy tham khảo đoạn mã sau đây lọc cho MyCollection và chỉ thao tác chèn:
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)
Lưu ý: Con trỏ có sẵn chỉ hoạt động với các bộ sưu tập được giới hạn. Nó không thể được sử dụng để ghi nhật ký các hoạt động trên một bộ sưu tập, thay vào đó sử dụng bộ lọc:'ns': 'MyDb.MyCollection'
Lưu ý: Tôi hiểu rằng mã nodejs và python ở trên có thể không giúp ích nhiều cho một số người. Tôi vừa cung cấp các mã để tham khảo.
Sử dụng liên kết này để tìm tài liệu cho con trỏ khả dụng trong lựa chọn trình điều khiển / trình điều khiển Mongodb của bạn
Một tính năng khác mà tôi đã thêm sau logrotate này .
mongod -vv
làm việc cho tôi