詳細なログを収集することは、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でのロギングを有効にするためのこのガイドが、セットアップに役立つことを願っています。ご不明な点がある場合やサポートが必要な場合は、下のコメントセクションにコメントを残してください。