ロガーの構成

Datadog にログを送信するには、ファイルにログを記録し、Datadog Agent でそのファイルをテールします。Node.js アプリケーションからログを取るには、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' });

Winston が JSON でログを取っていることを確認するために、<FILE_NAME>.log ファイルの中身を確認します。

{"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"}

Datadog Agent の構成

ログ収集が有効になったら、ログファイルを追跡して新しいログを Datadog に送信するカスタムログ収集を設定します。

  1. nodejs.d/ フォルダーを conf.d/ Agent 構成ディレクトリに作成します。
  2. nodejs.d/ に以下の内容で conf.yaml ファイルを作成します。
init_config:

instances:

##Log セクション
logs:

  - type: file
    path: "<FILE_NAME_PATH>.log"
    service: <SERVICE_NAME>
    source: nodejs
    sourcecategory: sourcecode
  1. Agent を再起動します
  2. Agent の status サブコマンドを実行し、Checks セクションで nodejs を探し、ログが Datadog に正常に送信されることを確認します。

ログが JSON 形式の場合、Datadog は自動的にログメッセージをパースし、ログ属性を抽出します。ログエクスプローラーを使用して、ログを表示し、トラブルシューティングを行うことができます。

ログとトレースにおけるサービスを接続

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

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

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

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

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

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

const httpTransportOptions = {
  host: 'http-intake.logs.',
  path: '/api/v2/logs?dd-api-key=<DATADOG_API_KEY>&ddsource=nodejs&service=<APPLICATION_NAME>',
  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 も使用できます。

トラブルシューティング

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

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

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

その他の参考資料