sql >> データベース >  >> NoSQL >> MongoDB

MongooseおよびMongoDBNode.JSドライバーのロギングを有効にする方法

    詳細なログを収集することは、MongoDBとの接続関連の問題をデバッグする際の重要なステップです。この短い投稿では、MongoDBNode.JSドライバーとMongooseでログを有効にする方法を示します。この説明では、Mongooseバージョン5.xとドライバーバージョン3.5を参照します。

    MongoDBNode.JSドライバーのログ

    ネイティブドライバーのロギングメカニズムは、ロギングドキュメントで詳しく説明されています。重要な機能は次のとおりです。

    • 3つのログレベルがあります–debuginfowarn および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として 。

    MongooseとMongoDBNode.JSドライバーのロギングを有効にする方法クリックしてツイート

    カスタムロガー

    ドライバーのドキュメントにはカスタムロガーの作成例が記載されていますが、あまり役に立ちません。通常、これらのログを標準のアプリケーションログとは別のファイルに送信しようとしますが、カスタムロガー機能を使用してそれを実行できます。

    ドライバーのロギングソースコードを見ると、次のことが明らかになります。

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


    1. MongoDBをインストールする方法

    2. 素晴らしいMongoDBGUIツールの定義を支援する

    3. redisデータをMySQLに移動するためのより高速な方法

    4. MongooseのデフォルトのpromiseライブラリはMEANスタックで非推奨になりました