私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
前回の記事「」の続きです。Elasticsearch: Node.js ECS ロギング - Pino前回の記事に引き続き、Winston パッケージを使用したターゲットについて説明します。 Node.js アプリケーションはその日に合わせて ECS を生成します。この Node.js パッケージはウィンストン・ロガーフォーマッタが提供されており、 Elastic Common Schema (ECS) のロギング互換性がある。組み合わせる ファイルビート 送信者は、Elastic Stack 内の 1 か所からすべてのログを監視できます。 winston 3.x バージョン >=3.3.3 をサポートします。
- npm install @elastic/ecs-winston-format
- npm install winston
ウィンストン・ロギング.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- format: ecsFormat(/* options */), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- logger.info('hi');
- logger.error('oops there is a problem', { err: new Error('boom') });
上記のコードを実行した結果は次のようになります。
ファイルビート 7.16+
ファイルビート.yml
- filebeat.inputs:
- - type: filestream # 1
- paths: /path/to/logs.json
- parsers:
- - ndjson:
- overwrite_keys: true # 2
- add_error_key: true # 3
- expand_keys: true # 4
-
- processors: // 5
- - add_host_metadata: ~
- - add_cloud_metadata: ~
- - add_docker_metadata: ~
- - add_kubernetes_metadata: ~
ファイルビート < 7.16
ファイルビート.yml
- filebeat.inputs:
- - type: log
- paths: /path/to/logs.json
- json.keys_under_root: true
- json.overwrite_keys: true
- json.add_error_key: true
- json.expand_keys: true
-
- processors:
- - add_host_metadata: ~
- - add_cloud_metadata: ~
- - add_docker_metadata: ~
- - add_kubernetes_metadata: ~
詳細については、「」を参照してください。 ファイルビートリファレンス。
ウィンストン・ロギング.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- level: 'info',
- format: ecsFormat(/* options */), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- logger.info('hi');
- logger.error('oops there is a problem', { foo: 'bar' });
node winston-logging.js | jq .
このスクリプトを実行します (次の場所で入手可能)ここ取得したもの) は、上記と同様のログ出力を生成します。
フォーマッタはデータを JSON にシリアル化する役割を担うため、追加する必要はありません。 json フォーマッタ。さらに、フォーマッタはタイムスタンプを自動的に生成するため、追加する必要はありません。タイムスタンプ フォーマッタ。
デフォルトでは、フォーマッタは Error インスタンスの err メタフィールドを次のように変換します。 ECSエラーフィールド 。例えば例:
ウィンストン・ロギング.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
- const logger = winston.createLogger({
- format: ecsFormat(),
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const myErr = new Error('boom');
- logger.info('oops', { err: myErr });
err メタフィールドの特別な処理は、convertErr: false オプションを使用して無効にできます。
ウィンストン・ロギング.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
- const logger = winston.createLogger({
- format: ecsFormat({convertErr: false} ),
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const myErr = new Error('boom');
- logger.info('oops', { err: myErr });
ConvertReqRes: true オプションを使用すると、フォーマッタはそれぞれ req および res メタフィールドとして渡されたときに Node.js コアを自動的に変換します。 リクエスト そして応答 物体。
ウィンストン・ロギング.js
- const http = require('http');
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- level: 'info',
- format: ecsFormat({ convertReqRes: true }), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const server = http.createServer(handler);
- server.listen(3000, () => {
- logger.info('listening at http://localhost:3000')
- });
-
- function handler (req, res) {
- res.setHeader('Foo', 'Bar');
- res.end('ok');
- logger.info('handled request', { req, res }); // 2
- }
これは使用します ECS HTTP フィールドリクエストとレスポンスの情報を含むログを生成します。例えば例:
上記にアクセスする必要があります http://ローカルホスト:3000 そうすることでのみ、上記の日の情報を確認できます。
これ ECCS ログフォーマッタ付きエラスティックAPM 統合された。Node アプリケーションが使用している場合Node.js エラスティック APM エージェント、APM サービスまたはトレース データとログ データを関連付けるために、いくつかのフィールドがログ レコードに追加されます。
たとえば、実行します 例/http-with-elastic-apm.js そしてカール -i ローカルホスト:3000/ 次の内容を含むログ レコードが生成されます。
- % node examples/http-with-elastic-apm.js | jq .
- ...
- "service.name": "http-with-elastic-apm",
- "service.version": "1.4.0",
- "service.environment": "development",
- "event.dataset": "http-with-elastic-apm"
- "trace.id": "7fd75f0f33ff49aba85d060b46dcad7e",
- "transaction.id": "6c97c7c1b468fa05"
- }
これらの ID は、APM エージェントによって報告された追跡データと一致します。
Elastic APM との統合は、apmIntegration: false オプションを使用して明示的に無効にすることができます。次に例を示します。
- const logger = winston.createLogger({
- format: ecsFormat({ apmIntegration: false }),
- // ...
- })
ecs-logging の仕様ログ レコードの最初の 3 つのフィールドは、@timestamp、log.level、および message にすることをお勧めします。バージョン 1.5.0 以降、このフォーマッタはこの推奨事項に従っていません。これは可能ですが、ログ レコードごとに ecsFields に新しいオブジェクトを作成する必要があります。 ecs-logging フィールドの順序は読みやすさを目的としたものであり、相互運用性に影響を与えないことを考慮して、パフォーマンスを優先することが決定されました。
ECS ログ形式を出力する winston 用のフォーマッタを作成します。これは治療法ですecsFields([オプション]) そしてecsStringify([オプション]) シングルフォーマット。次の 2 つは同等です。
- const { ecsFormat, ecsFields, ecsStringify } = require('@elastic/ecs-winston-format');
- const winston = require('winston');
-
- const logger = winston.createLogger({
- format: ecsFormat(/* options */),
- // ...
- });
-
- const logger = winston.createLogger({
- format: winston.format.combine(
- ecsFields(/* options */),
- ecsStringify()
- ),
- // ...
- });
ログ情報オブジェクトのフィールドを ECS ログ形式に変換する winston 用のフォーマッタを作成します。
ログ レコードを JSON に文字列化/シリアル化するための winston 用のフォーマッタを作成します。
これは logform.json() に似ています。どちらも、safe-stable-stringify パッケージを使用して JSON を生成します。いくつかの違い: