ロガーの構成
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 に送信するカスタムログ収集を設定します。
nodejs.d/
フォルダーを conf.d/
Agent 構成ディレクトリに作成します。nodejs.d/
に以下の内容で conf.yaml
ファイルを作成します。
init_config:
instances:
##Log セクション
logs:
- type: file
path: "<FILE_NAME_PATH>.log"
service: <SERVICE_NAME>
source: nodejs
sourcecategory: sourcecode
- Agent を再起動します。
- Agent の status サブコマンドを実行し、
Checks
セクションで nodejs
を探し、ログが Datadog に正常に送信されることを確認します。
ログが JSON 形式の場合、Datadog は自動的にログメッセージをパースし、ログ属性を抽出します。ログエクスプローラーを使用して、ログを表示し、トラブルシューティングを行うことができます。
ログとトレースにおけるサービスを接続
APM が有効になっているアプリケーションの場合は、APM Node.js の指示に従いログにトレース ID、スパン ID、env
、service
、version
を自動的に追加し、ログとトレースを接続します。
注: 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_retries
を 1
に設定しないようにしてください (デフォルトは 4
)。
その他の参考資料