Thu thập nhật ký chi tiết là bước quan trọng khi gỡ lỗi các vấn đề liên quan đến kết nối với MongoDB. Trong bài đăng ngắn này, chúng tôi sẽ hướng dẫn cách kích hoạt đăng nhập trên trình điều khiển MongoDB Node.JS và Mongoose. Chúng tôi đề cập đến phiên bản Mongoose 5.x và phiên bản trình điều khiển 3.5 trong cuộc thảo luận này.
Ghi nhật ký trình điều khiển MongoDB Node.JS
Cơ chế ghi nhật ký cho trình điều khiển gốc được giải thích rõ trong tài liệu ghi nhật ký. Các tính năng cơ bản là:
- Có 3 cấp độ nhật ký -
debug
,info
,warn
và lỗierror
. Mặc định làerror
.info
là một lựa chọn tốt khi cố gắng gỡ lỗi các vấn đề.debug
cho phép theo dõi cực kỳ chi tiết, vì vậy chỉ sử dụng khi nhật ký được tạo tạiinfo
cấp độ là không đủ. - Theo mặc định, nhật ký truy cập
console.log()
Đặt mức nhật ký
Trong mã
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Khi đặt cấp độ nhật ký trong mã, bạn cũng có thể thêm bộ lọc cho các lớp cụ thể. Ví dụ:
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Qua các tùy chọn
Trình ghi error
và logLevel
cũng có thể được chuyển qua các tùy chọn kết nối, chúng tôi sẽ hiển thị cho bạn một ví dụ trong phần Mongoose.
Ghi nhật ký cho Mongoose
Bật ghi nhật ký cấp gỡ lỗi cho Mongoose rất đơn giản:
mongoose.set('debug', true)
Tuy nhiên, điều này chỉ cho phép ghi nhật ký các hoạt động MongoDB như truy vấn và cập nhật. Nếu bạn đang tìm cách gỡ lỗi các vấn đề liên quan đến kết nối, nhóm kết nối, v.v. thì điều này không có ích gì.
Mặt khác, vì Mongoose sử dụng trình điều khiển MongoDB Node.JS bên dưới, nếu chúng tôi bật ghi nhật ký cho trình điều khiển, chúng tôi cũng sẽ có thể lấy được nhật ký từ trình điều khiển. Cách dễ nhất để làm điều này là vượt qua các tùy chọn liên quan đến nhật ký. Ví dụ:
// logging options for the driver var options = { logger: console.log, loggerLevel: 'info', poolSize: 10 } var uri = 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/mydatabase'; // with options mongoose.connect(uri, options);
Ngoại trừ các tùy chọn cụ thể của Mongoose, Mongoose chuyển tất cả các tùy chọn khác cho trình điều khiển. Tài liệu trình điều khiển giải thích các tùy chọn sau:
-
loggerLevel
- chuỗi - tùy chọn - Mức ghi nhật ký (lỗi / cảnh báo / thông tin / gỡ lỗi) -
logger
- đối tượng - tùy chọn - Đối tượng trình ghi tùy chỉnh
Trong ví dụ trên, chúng ta chuyển loggerLevel
dưới dạng info
và logger
dưới dạng console.log
.
Trình ghi nhật ký tùy chỉnh
Mặc dù tài liệu trình điều khiển cung cấp ví dụ về cách viết trình ghi tùy chỉnh, nhưng nó không hữu ích lắm. Thông thường, chúng tôi sẽ cố gắng gửi các nhật ký này đến một tệp khác, không phải các nhật ký ứng dụng tiêu chuẩn và chúng tôi có thể sử dụng chức năng ghi nhật ký tùy chỉnh để có thể thực hiện điều đó.
Nếu bạn nhìn vào mã nguồn ghi nhật ký của trình điều khiển, điều sau sẽ rõ ràng:
- Trình ghi mặc định là
console.log
- Trình ghi nhật ký phải là một chức năng
- Chức năng ghi nhật ký mất hai đối số:
- Chuỗi thông báo có định dạng như sau:
[LEVEL-className:pid] timestamp logMsg
Ví dụ:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Một đối tượng trạng thái có chứa thông tin sau:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
Ví dụ:
{ type: 'info', message: 'server sg-rs-91.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}', className: 'Server', pid: 9224, date: 1589439590772 }
Vì vậy, để viết trình ghi tùy chỉnh, bạn có thể chỉ cần viết một hàm để sử dụng khung ghi nhật ký mà bạn chọn để ghi những thông báo này theo định dạng bạn muốn.
Đây là trình ghi Bunyan khá nguyên thủy được thiết lập làm trình ghi tùy chỉnh:
var Logger = require('bunyan'); var log = Logger.createLogger({ name: "MongoDB Driver", streams: [ { stream: process.stdout, level: 'info' }, { stream: process.stdout, level: 'debug' }, { stream: process.stderr, level: 'error' } ], }); function mongoLogger(msg, state) { // console.log(msg, state); switch (state.type) { case 'debug': log.debug(state); break; case 'info': log.info(state); break; case 'warn': log.warn(state); case 'error': default: log.error(state); } }
Sau đó, chuyển nó vào tùy chọn của bạn:
var options = { logger: mongoLogger, loggerLevel : 'info' }
Kết quả đầu ra từ console.log sau đó sẽ là:
[INFO-Server:9413] 1589442507330 server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\n at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"} { type: 'info', message: 'server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"}', className: 'Server', pid: 9413, date: 1589442507330 }
Đầu ra của Bunyan sẽ là:
{"name":"MongoDB Driver","hostname":"<hostname>","pid":9413,"level":30,"type":"info","message":"server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {\"name\":\"MongoNetworkError\",\"message\":\"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\",\"stack\":\"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)\"}","className":"Server","date":1589442507330,"msg":"","time":"2020-05-14T07:48:27.331Z","v":0}
Sau đó, bạn sẽ có thể sử dụng tất cả các tính năng của Bunyan để xử lý các bản ghi khi bạn thấy phù hợp, ví dụ:gửi chúng đến một tệp luân phiên, tách ra các thông báo lỗi và thông tin, v.v.
Chúng tôi hy vọng hướng dẫn bật đăng nhập trên trình điều khiển MongoDB Node.JS và Mongoose này sẽ hữu ích cho bạn trong quá trình thiết lập. Hãy để lại ý kiến trong phần bình luận bên dưới nếu bạn có bất kỳ câu hỏi hoặc cần bất kỳ trợ giúp nào.