Technology sharing

Elasticsearch: Node.js ECS Logging - Winston

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Haec continuatio prioris articuli "Elasticsearch: Node.js ECS Logging - Pino"Continuatio. Priorem articulum continuamus loqui de usura in sarcina Winston ad scopum" Node.js Applicatio generat ECS ut par diei.Hoc Node.js sarcina estwinston loggerFormattor provisus, cum Schema commune elasticum (ECS) logging compatitur.simulFilebeat Mittens, omnia tigna ab uno loco in Stack elastica monitori potes. Support winston 3.x version >=3.3.3.

extruxerat

install

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

Configurationis

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') });
  • Transire ECS formatter ad winston.

Effectus currit in codice supra scriptum est:

Configurare Filebeat

Filebeat 7.16+

filebeat.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. Filestream input utere ut lineas legere ex lima stipes activo.
  2. Si conflictus incidit, valores obiecti JSON decoded rescribent agros quos Filebeat normaliter addit (type, fons, offset, etc.).
  3. Si JSON error inexplicabilis incidit, Filebeat adde "errorem.message" et "errorem.type: json" claves.
  4. Filebeat recursively punctum claves ex JSON decoctae spoliabit et in structuram hierarchicam dilatabit.
  5. Processus notitia tua augendae.Videprocessors discere magis.

Filebeat < 7.16

filebeat.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: ~

Pro maiori, vide Filebeat reference

quam uti?

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. Optiones available vide infra.
node winston-logging.js | jq .

Curre hoc scriptum (available athic "adeptus) producet log output similes supra.

Formatter ad serializing notitias in JSON responsabilis est, ideo addere non debes json Formattor.Accedit quod formatter indicationem notionis automatice generat, ideo addere non debesindicatione Formattor.

Error logging

Per defaltam formatter erratum convertit in instantia metafield erroris ECSError agri .Exempli gratiaexemplum

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 });

Specialis pertractatio metafield errantis per convertErr debilitari potest: optio falsa:

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 petitio et responsio logging

Using the convertReqRes: vera optio, formatter sponte convertet Node.js nucleum cum transiit ut req et res metafields respectively. petitio etresponsio objectum.

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. Utere convertReqRes optionem
  2. Record req et / vel res metafields

Hoc erit utere ECS HTTP agri Generat index petitionem ac responsionem notitia continentur.Exempli gratiaexemplum

Superius opus est accedere http://localhost:3000 Tantum ergo diei indicium supra ostensum est videre potes.

Usus APM ad log ratione

hoc ECS cum formatter iniuriarumElastica APM integratur.Si usus application est: NodeNode.js Elastica APM Agent, adduntur complura agri ad indicem tabularum ad APM officium vel vestigium et notitias referendas:

  • Iniuriarum constitutiones (ut logger.info(...)) dicuntur, cum currently spatium repetens comprehendettracking agros- trace.id、transaction.id、span.id。
  • Multiplices usus agrorum identificantium, ab agente APM determinati vel figurati, transversis vinculis inter officia et tigna in Kibana permittunt - servitium. nomen, servitium, versionem, servitium.environmentum, servitium.node.name.
  • event.dataset est enabled in applicationes Elasticae ObservabilitatisLog rate anomaliae deprehensio

Exempli gratia, currere exempla/http-with-elastic-apm.js etCrispum -i localhost: MMM/ Index index continens sequenti contenta prodit:

  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. }

Hae IDs aequant notitias sequi notitias ab APM agente relatas.

Integratio cum APM Elastica explicite debilitata esse potest per apmIntegration: optio falsa, exempli gratia:

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

Limites et Notae

ecs-logging speciem Commendatur ut tres priores agri in indice index sit @timestamp, log.level, nuntius. Incipiens a versione 1.5.0, formator hanc commendationem non sequitur. Hoc fieri potest, sed novum obiectum requirit in ecsFields pro singulis tabulis. Cum ordinatio agrorum ecs-logionum ad promptitudinem sit et non interoperabilitatem afficit, perficiendi prioritizare placuit.

refer ad

ecsFormat([options])

  • optiones {type-object} sequentes optiones sustinet:
    • convertErr {type-boolean} Utrum errorem agri recordi convertere in errorem agri ECS.default pretiiverum
    • convertReqRes {type-boolean} Utrum req et res HTTP rogationis et responsionis agros in ECS HTTP, agentis et url agri usoris aperi.default pretiifalsus。
    • apmIntegration {type-boolean} Utrum APM integrationem agentis perficiat.default pretiiverum
    • serviceName {type-string} "service.name" valorem. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceVersion {type-string} "service.version" value. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceEnvironment {type-string} "service.environment" value. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceNodeName {type-string} "service.node.name" value. Si specificatur, quaevis valor ex agente activo APM in scriptis erit.
    • eventDataset {type-string} "event.dataset" value. Si specificatur, defalta valor utendi ${serviceVersion}, opprimetur.

Facere formattrum pro winston, qui ECS logging format formatam emittit.Haec curatio estecsFields ([options]) etecsStringify([optiones]) una forma. Sequentia duo aequiparantur;

  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])

  • optiones {type-object} sequentes optiones sustinet:
    • convertErr {type-boolean} Utrum errorem agri recordi convertere in errorem agri ECS.default pretiiverum
    • convertReqRes {type-boolean} Utrum req et res HTTP rogationis et responsionis agros in ECS HTTP, agentis et url agri usoris aperi.default pretiifalsus。
    • apmIntegration {type-boolean} Utrum APM integrationem agentis perficiat.default pretiiverum
    • serviceName {type-string} "service.name" valorem. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceVersion {type-string} "service.version" value. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceEnvironment {type-string} "service.environment" value. Si specificatur, aliquem valorem vincit ab agente activo APM.
    • serviceNodeName {type-string} "service.node.name" value. Si specificatur, quaevis valor ex agente activo APM in scriptis erit.
    • eventDataset {type-string} "event.dataset" value. Si specificatur, default occasus utendi ${serviceVersion}, opprimetur.

Formatorem crea pro Winston qui agros convertit in notitia explorationis obiecti ad ECS loging forma.

ecsStringify([optiones])

Facere formatorem pro winston ad stringendum/serialize tabulas logas ad JSON.

Hoc simile est cum logform.json(). Uterque sarcinis stabilis firmificans utuntur ad JSON generandum. Differentiae nonnullae:

  • Hic stringificor campum campum serializing vagatur quia campus ECS non est.
  • Winston praebet repositorium qui ad chordas convertit. Cuius ratio est, quia JavaScript JSON parser praecisionem amittit cum bigints parsing. Objectio est quod BigInt mutat genus ad chordas pro numero. In statu, hoc stringificium BitInt ad chordas non convertit.