NodeJS ログ収集
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

NodeJS ログ収集

ロガーの構成

NodeJS アプリケーションからのログ収集に Winston を使用すると、ログ戦略の構築に必要なすべての機能を得ることができます。

Winston は、NPM から入手できます。最初に、コードに依存関係を追加する必要があります。

npm install --save winston

package.json が更新され、対応する依存関係が追加されます。

{
  "name": "...",

  //...
  "dependencies": {
    //...
    "winston": "x.y.z",
    //...
  }
}

ファイルへのログ記録

ブートストラップファイルまたはコード内のいずれかの場所で、次のようにロガーを宣言します。


const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  level: 'info',
  exitOnError: false,
  format: format.json(),
  transports: [
    new transports.File({ filename: `${appRoot}/logs/<FILE_NAME>.log` }),
  ],
});

module.exports = logger;

// ログの例
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });
var winston = require('winston');

var logger = new (winston.Logger)({
    transports: [
        new (winston.transports.File)({
            name: '<LOGGER_NAME>',
            filename: '<FILE_NAME>.log',
      json: true,
            level: 'info'
        })
    ]
});

// ログの例
logger.log('info', 'Hello simple log!');
logger.info('Hello log with metas',{color: 'blue' });

<FILE_NAME>.log ファイルの内容をチェックして、Winston がすべてのログを JSON で記録していることを確認します。

{"level":"info","message":"Hello simple log!","timestamp":"2015-04-23T16:52:05.337Z"}
{"color":"blue","level":"info","message":"Hello log with metas","timestamp":"2015-04-23T16:52:05.339Z"}

ログとトレース全体のサービスを接続

APM が有効になっているアプリケーションの場合は、APM Nodejs の指示に従いログにトレース ID、スパン ID、envserviceversion を自動的に追加し、ログとトレースを接続します。

: APM トレーサーがログに service を挿入する場合、Agent 構成で設定されている値は上書きされます。

Datadog Agent の構成

conf.d/ フォルダーに次の内容の nodejs.d/conf.yaml ファイルを作成します。

init_config:

instances:

##Log section
logs:

  - type: file
    path: "<ファイル名パス>.log"
    service: nodejs
    source: nodejs
    sourcecategory: sourcecode

エージェントレスのログ収集

ホストに Agent をインストールしなくても、アプリケーションから Datadog にログをストリーミングできます。ネイティブ接続管理を提供するため、Agent を使用してログを転送することをお勧めします。

Winston HTTP 転送を使用して、Datadog Log API を介してログを直接送信します。 ブートストラップファイルまたはコード内のいずれかの場所で、次のようにロガーを宣言します。

const { createLogger, format, transports } = require('winston');

const httpTransportOptions = { host: 'http-intake.logs.datadoghq.com', path: '/v1/input/<APIKEY>?ddsource=nodejs&service=<アプリケーション名>', ssl: true };

const logger = createLogger({ level: 'info', exitOnError: false, format: format.json(), transports: [ new transports.Http(httpTransportOptions), ], });

module.exports = logger;

// サンプルログ logger.log('info', 'Hello simple log!'); logger.info('Hello log with metas',{color: 'blue' });

注: コミュニティでサポートされている Datadog Transport も確認できます。

const { createLogger, format, transports } = require('winston');

const httpTransportOptions = { host: 'http-intake.logs.datadoghq.eu', path: '/v1/input/<APIKEY>?ddsource=nodejs&service=<アプリケーション名>', ssl: true };

const logger = createLogger({ level: 'info', exitOnError: false, format: format.json(), transports: [ new transports.Http(httpTransportOptions), ], });

module.exports = logger;

// サンプルログ logger.log('info', 'Hello simple log!'); logger.info('Hello log with metas',{color: 'blue' });

トラブルシューティング

アプリケーションで DNS 参照エラーやクラッシュが発生すると、それが logstash 例外にリンクされて捕捉されなくなる可能性があります。 次のハンドラーを追加してください。

var logstash = new winston.transports.Logstash({ ... });
logstash.on('error', function(err) {
    console.error(err); // ここは、独自の機能に置き換えます
});

パラメーター max_connect_retries1 に設定しないようにしてください (デフォルトは 4)。

その他の参考資料