詳細なログを収集することは、MongoDBとの接続関連の問題をデバッグする際の重要なステップです。この短い投稿では、MongoDBNode.JSドライバーとMongooseでログを有効にする方法を示します。この説明では、Mongooseバージョン5.xとドライバーバージョン3.5を参照します。
MongoDBNode.JSドライバーのログ
ネイティブドライバーのロギングメカニズムは、ロギングドキュメントで詳しく説明されています。重要な機能は次のとおりです。
- 3つのログレベルがあります–
debug、info、warnおよびerror。デフォルトはerrorです 。info問題をデバッグしようとするときは、適切な選択です。debug非常に詳細なトレースが可能になるため、infoで生成されたログの場合にのみ使用してください レベルが十分ではありません。 - デフォルトでは、ログは
console.log()に移動します
ログレベルの設定
コード内
const MongoClient = require('mongodb').MongoClient;
const Logger = require('mongodb').Logger;
Logger.setLevel('info');
コードでログレベルを設定するときに、特定のクラスのフィルターを追加することもできます。例:
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
オプション経由
logger およびlogLevel 接続オプションを介して渡すこともできます。マングースのセクションで例を示します。
マングースのロギング
Mongooseのデバッグレベルのログを有効にするのは簡単です:
mongoose.set('debug', true)
ただし、これにより、クエリや更新などのMongoDB操作のログのみが有効になります。接続、接続プールなどに関連する問題をデバッグする場合、これは役に立ちません。
一方、Mongooseはその下にあるMongoDB Node.JSドライバーを利用しているため、ドライバーのログを有効にすると、ドライバーからもログを取得できるようになります。これを行う最も簡単な方法は、ログ関連のオプションを渡すことです。例:
// 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);
Mongoose固有のオプションを除いて、Mongooseは他のすべてのオプションをドライバーに渡します。ドライバのドキュメントでは、次のオプションについて説明しています。
-
loggerLevel–文字列–オプション–ログレベル(エラー/警告/情報/デバッグ) logger–オブジェクト–オプション–カスタムロガーオブジェクト
上記の例では、loggerLevelを渡します。 infoとして およびlogger console.logとして 。
カスタムロガー
ドライバーのドキュメントにはカスタムロガーの作成例が記載されていますが、あまり役に立ちません。通常、これらのログを標準のアプリケーションログとは別のファイルに送信しようとしますが、カスタムロガー機能を使用してそれを実行できます。
ドライバーのロギングソースコードを見ると、次のことが明らかになります。
- デフォルトのロガーは
console.logです - ロガーは関数である必要があります
- ロガー関数は2つかかります 引数:
- 次の形式のメッセージ文字列:
[LEVEL-className:pid] timestamp logMsg
例:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}でイベントエラーを発生させました - 次の情報を含む状態オブジェクト:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };例:
{ 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 }
したがって、カスタムロガーを作成するには、選択したログフレームワークを使用してこれらのメッセージを希望の形式でログに記録する関数を作成するだけです。
これは、カスタムロガーとして設定されたかなり原始的なBunyanロガーです:
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);
}
}
次に、オプションで渡します:
var options = {
logger: mongoLogger,
loggerLevel : 'info'
}
console.logからの出力は次のようになります。
[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 }
バニヤンの出力は次のようになります:
{"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}
これで、Bunyanのすべての機能を使用して、適切と思われるログを処理できるようになります。それらをローテーションファイルに送信し、エラーメッセージや情報メッセージなどを分離します。
MongoDB Node.JSドライバーとMongooseでのロギングを有効にするためのこのガイドが、セットアップに役立つことを願っています。ご不明な点がある場合やサポートが必要な場合は、下のコメントセクションにコメントを残してください。