моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Это продолжение предыдущей статьи»Elasticsearch: ведение журнала ECS Node.js — PinoПродолжение. Продолжаем предыдущую статью, чтобы рассказать об использовании пакета Winston для таргетинга. Node.js Приложение генерирует ECS в соответствии с днем.Этот пакет Node.jsУинстон-логгерПредоставляется форматтер с Ведение журнала Elastic Common Schema (ECS) совместимый.объединитьФайлбит Отправитель, вы можете отслеживать все журналы из одного места в Elastic Stack. Поддержка версии Winston 3.x >=3.3.3.
- npm install @elastic/ecs-winston-format
- npm install winston
winston-logging.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+
файлbeat.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
файлbeat.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: ~
Для получения дополнительной информации см. Справочник по Filebeat。
winston-logging.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 Форматер.Кроме того, форматтер автоматически генерирует временную метку, поэтому вам не нужно добавлятьвременная метка Форматер.
По умолчанию форматировщик преобразует метаполе err экземпляра Error в Поле ECSError .Напримерпример:
winston-logging.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:
winston-logging.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, форматтер автоматически преобразует ядро Node.js, когда оно передается как метаполя req и res соответственно. запрос иответ объект.
winston-logging.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
- }
Это будет использовать HTTP-поля ECS Создает журнал, содержащий информацию о запросах и ответах.Напримерпример:
Выше нам нужен доступ http://localhost:3000 Только тогда вы сможете увидеть информацию о дне, показанную выше.
этот ЭКС форматировщик журналов сЭластичный APM интегрированный.Если ваше приложение Node используетNode.js Elastic APM-агент, в запись журнала добавляется несколько полей для сопоставления службы APM или данных трассировки и журнала:
Например, запустите примеры/http-with-elastic-apm.js иcurl -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"
- }
Эти идентификаторы соответствуют данным отслеживания, сообщаемым агентом APM.
Интеграцию с Elastic APM можно явно отключить с помощью параметра apmIntegration: false, например:
- const logger = winston.createLogger({
- format: ecsFormat({ apmIntegration: false }),
- // ...
- })
спецификация ecs-логов Рекомендуется, чтобы первые три поля в записи журнала были @timestamp, log.level и message. Начиная с версии 1.5.0 форматтер не следует этой рекомендации. Это возможно, но требует создания нового объекта в ecsFields для каждой записи журнала. Учитывая, что порядок полей ecs-logging предназначен для удобства чтения и не влияет на совместимость, было решено отдать приоритет производительности.
Создайте форматировщик для Winston, который генерирует формат журнала ECS.Это лечениеecsFields([опции]) иecsStringify([опции]) единый формат. Следующие два эквивалентны:
- 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()
- ),
- // ...
- });
Создайте средство форматирования для Winston, которое преобразует поля объекта информации журнала в формат журнала ECS.
Создайте форматировщик для Winston для преобразования в строку/сериализации записей журнала в JSON.
Это похоже на logform.json(). Они оба используют пакет Safe-Stable-Stringify для генерации JSON. Некоторые различия: