Обмен технологиями

Elasticsearch: ведение журнала ECS Node.js — Winston

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.

настраивать

Установить

  1. npm install @elastic/ecs-winston-format
  2. npm install winston

Конфигурация

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(/* options */), // 1
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. logger.info('hi');
  10. logger.error('oops there is a problem', { err: new Error('boom') });
  • Передайте форматер ECS Winston.

Результат выполнения приведенного выше кода:

Настроить Filebeat

Файлбит 7.16+

файлbeat.yml

  1. filebeat.inputs:
  2. - type: filestream # 1
  3. paths: /path/to/logs.json
  4. parsers:
  5. - ndjson:
  6. overwrite_keys: true # 2
  7. add_error_key: true # 3
  8. expand_keys: true # 4
  9. processors: // 5
  10. - add_host_metadata: ~
  11. - add_cloud_metadata: ~
  12. - add_docker_metadata: ~
  13. - add_kubernetes_metadata: ~
  1. Используйте ввод файлового потока для чтения строк из файла журнала активности.
  2. В случае возникновения конфликта значения декодированного объекта JSON перезапишут поля, которые обычно добавляет Filebeat (тип, источник, смещение и т. д.).
  3. Если произойдет ошибка демаршаллинга JSON, Filebeat добавит ключи error.message и error.type: json.
  4. Filebeat рекурсивно удалит точечные ключи из декодированного JSON и расширит его до иерархической структуры объектов.
  5. Процессоры улучшают качество ваших данных.Видетьпроцессоры Узнать больше.

Файлбит < 7.16

файлbeat.yml

  1. filebeat.inputs:
  2. - type: log
  3. paths: /path/to/logs.json
  4. json.keys_under_root: true
  5. json.overwrite_keys: true
  6. json.add_error_key: true
  7. json.expand_keys: true
  8. processors:
  9. - add_host_metadata: ~
  10. - add_cloud_metadata: ~
  11. - add_docker_metadata: ~
  12. - add_kubernetes_metadata: ~

Для получения дополнительной информации см. Справочник по Filebeat

как использовать

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. level: 'info',
  5. format: ecsFormat(/* options */), // 1
  6. transports: [
  7. new winston.transports.Console()
  8. ]
  9. });
  10. logger.info('hi');
  11. logger.error('oops there is a problem', { foo: 'bar' });
  1. Доступные варианты смотрите ниже.
node winston-logging.js | jq .

Запустите этот скрипт (доступен по адресуздесьполучено) выдаст вывод журнала, аналогичный приведенному выше.

Модуль форматирования отвечает за сериализацию данных в JSON, поэтому вам не нужно добавлять json Форматер.Кроме того, форматтер автоматически генерирует временную метку, поэтому вам не нужно добавлятьвременная метка Форматер.

Ошибка регистрации

По умолчанию форматировщик преобразует метаполе err экземпляра Error в Поле ECSError .Напримерпример

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(),
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. const myErr = new Error('boom');
  10. logger.info('oops', { err: myErr });

Специальную обработку метаполя err можно отключить с помощью опции ConvertErr: false:

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat({convertErr: false} ),
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. const myErr = new Error('boom');
  10. logger.info('oops', { err: myErr });

Протоколирование HTTP-запросов и ответов

Используя опцию ConvertReqRes: true, форматтер автоматически преобразует ядро ​​Node.js, когда оно передается как метаполя req и res соответственно. запрос иответ объект.

winston-logging.js

  1. const http = require('http');
  2. const winston = require('winston');
  3. const { ecsFormat } = require('@elastic/ecs-winston-format');
  4. const logger = winston.createLogger({
  5. level: 'info',
  6. format: ecsFormat({ convertReqRes: true }), // 1
  7. transports: [
  8. new winston.transports.Console()
  9. ]
  10. });
  11. const server = http.createServer(handler);
  12. server.listen(3000, () => {
  13. logger.info('listening at http://localhost:3000')
  14. });
  15. function handler (req, res) {
  16. res.setHeader('Foo', 'Bar');
  17. res.end('ok');
  18. logger.info('handled request', { req, res }); // 2
  19. }
  1. Используйте опцию ConvertReqRes
  2. Метаполя записи req и/или res

Это будет использовать HTTP-поля ECS Создает журнал, содержащий информацию о запросах и ответах.Напримерпример

Выше нам нужен доступ http://localhost:3000 Только тогда вы сможете увидеть информацию о дне, показанную выше.

Используйте APM для корреляции журналов

этот ЭКС форматировщик журналов сЭластичный APM интегрированный.Если ваше приложение Node используетNode.js Elastic APM-агент, в запись журнала добавляется несколько полей для сопоставления службы APM или данных трассировки и журнала:

  • Операторы журнала (такие как logger.info(...)) вызываемые при текущей трассировке диапазона, будут включатьполя отслеживания— trace.id, transaction.id, span.id.
  • Несколько полей идентификатора службы, определенные или настроенные в агенте APM, позволяют осуществлять перекрестную связь между службами и журналами в Kibana — service.name, service.version, service.environment, service.node.name.
  • event.dataset включен в приложениях Elastic Observability.Обнаружение аномалий скорости записи

Например, запустите примеры/http-with-elastic-apm.js иcurl -i локальный хост:3000/ Создается запись журнала, содержащая следующее содержимое:

  1. % node examples/http-with-elastic-apm.js | jq .
  2. ...
  3. "service.name": "http-with-elastic-apm",
  4. "service.version": "1.4.0",
  5. "service.environment": "development",
  6. "event.dataset": "http-with-elastic-apm"
  7. "trace.id": "7fd75f0f33ff49aba85d060b46dcad7e",
  8. "transaction.id": "6c97c7c1b468fa05"
  9. }

Эти идентификаторы соответствуют данным отслеживания, сообщаемым агентом APM.

Интеграцию с Elastic APM можно явно отключить с помощью параметра apmIntegration: false, например:

  1. const logger = winston.createLogger({
  2. format: ecsFormat({ apmIntegration: false }),
  3. // ...
  4. })

Ограничения и примечания

спецификация ecs-логов Рекомендуется, чтобы первые три поля в записи журнала были @timestamp, log.level и message. Начиная с версии 1.5.0 форматтер не следует этой рекомендации. Это возможно, но требует создания нового объекта в ecsFields для каждой записи журнала. Учитывая, что порядок полей ecs-logging предназначен для удобства чтения и не влияет на совместимость, было решено отдать приоритет производительности.

Ссылаться на

ecsFormat([опции])

  • options {type-object} поддерживает следующие параметры:
    • ConvertErr {type-boolean} Следует ли преобразовать поле ошибки записи в поле ошибки ECS.значение по умолчанию:истинный.
    • ConvertReqRes {type-boolean} Указывает, регистрировать ли поля HTTP-запроса и ответа req и res в полях ECS HTTP, User-Agent и URL.значение по умолчанию:ЛОЖЬ.
    • apmIntegration {type-boolean} Включить ли интеграцию агента APM.значение по умолчанию:истинный.
    • serviceName {type-string} Значение "service.name". Если указано, переопределяет любое значение активного агента APM.
    • serviceVersion {строка-типа} Значение "service.version". Если указано, переопределяет любое значение активного агента APM.
    • serviceEnvironment {строка-типа} Значение "service.environment". Если указано, переопределяет любое значение активного агента APM.
    • serviceNodeName {строка-типа} Значение "service.node.name". Если указано, любое значение активного агента APM будет перезаписано.
    • eventDataset {строка-типа} Значение "event.dataset". Если указано, значение по умолчанию использования ${serviceVersion} будет переопределено.

Создайте форматировщик для Winston, который генерирует формат журнала ECS.Это лечениеecsFields([опции]) иecsStringify([опции]) единый формат. Следующие два эквивалентны:

  1. const { ecsFormat, ecsFields, ecsStringify } = require('@elastic/ecs-winston-format');
  2. const winston = require('winston');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(/* options */),
  5. // ...
  6. });
  7. const logger = winston.createLogger({
  8. format: winston.format.combine(
  9. ecsFields(/* options */),
  10. ecsStringify()
  11. ),
  12. // ...
  13. });

ecsFields([опции])

  • options {type-object} поддерживает следующие параметры:
    • ConvertErr {type-boolean} Следует ли преобразовать поле ошибки записи в поле ошибки ECS.значение по умолчанию:истинный.
    • ConvertReqRes {type-boolean} Указывает, регистрировать ли поля HTTP-запроса и ответа req и res в полях ECS HTTP, User-Agent и URL.значение по умолчанию:ЛОЖЬ.
    • apmIntegration {type-boolean} Включить ли интеграцию агента APM.значение по умолчанию:истинный.
    • serviceName {type-string} Значение "service.name". Если указано, переопределяет любое значение активного агента APM.
    • serviceVersion {строка-типа} Значение "service.version". Если указано, переопределяет любое значение активного агента APM.
    • serviceEnvironment {строка-типа} Значение "service.environment". Если указано, переопределяет любое значение активного агента APM.
    • serviceNodeName {строка-типа} Значение "service.node.name". Если указано, любое значение активного агента APM будет перезаписано.
    • eventDataset {строка-типа} Значение "event.dataset". Если указано, настройка по умолчанию использования ${serviceVersion} будет переопределена.

Создайте средство форматирования для Winston, которое преобразует поля объекта информации журнала в формат журнала ECS.

ecsStringify([опции])

Создайте форматировщик для Winston для преобразования в строку/сериализации записей журнала в JSON.

Это похоже на logform.json(). Они оба используют пакет Safe-Stable-Stringify для генерации JSON. Некоторые различия:

  • Этот строковый преобразователь пропускает сериализацию поля уровня, поскольку оно не является полем ECS.
  • Winston предоставляет заменитель, который преобразует bigint в строку. Причина этого в том, что парсер JSON в JavaScript теряет точность при анализе bigints. Возражение состоит в том, что BigInt меняет тип на строку, а не на число. В настоящее время этот строковый преобразователь не преобразует BitInt в строку.