Condivisione della tecnologia

Elasticsearch: registrazione ECS Node.js - Winston

2024-07-12

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

Questa è una continuazione dell'articolo precedente "Elasticsearch: registrazione ECS Node.js - Pino” continuazione di Continuiamo l'articolo precedente per parlare dell'utilizzo del pacchetto Winston come target Node.js L'applicazione genera ECS per abbinare il giorno.Questo pacchetto Node.js lo èWinston LoggerViene fornito un formattatore Registrazione Elastic Common Schema (ECS). compatibile.combinareBattito di file Mittente, puoi monitorare tutti i log da un'unica posizione nell'Elastic Stack. Supporta la versione Winston 3.x >=3.3.3.

impostare

Installare

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

Configurazione

winston-registrazione.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') });
  • Passa il formattatore ECS a Winston.

Il risultato dell'esecuzione del codice sopra è:

Configura Filebeat

Versione 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. Utilizza l'input filestream per leggere le righe da un file di registro attivo.
  2. Se si verifica un conflitto, i valori dell'oggetto JSON decodificato sovrascriveranno i campi che Filebeat normalmente aggiunge (tipo, origine, offset, ecc.).
  3. Se si verifica un errore di unmarshalling JSON, Filebeat aggiungerà le chiavi "error.message" e "error.type: json".
  4. Filebeat rimuoverà ricorsivamente i tasti punto dal JSON decodificato e lo espanderà in una struttura di oggetti gerarchica.
  5. I processori migliorano i tuoi dati.Vedereprocessori per saperne di più.

Battito di file < 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: ~

Per ulteriori informazioni, vedere Riferimento a Filebeat

come usare

winston-registrazione.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. Vedi le opzioni disponibili di seguito.
node winston-logging.js | jq .

Esegui questo script (disponibile suQuiottenuto) produrrà un output di registro simile al precedente.

Il formattatore è responsabile della serializzazione dei dati in JSON, quindi non è necessario aggiungere json Formattatore.Inoltre, il formattatore genera automaticamente il timestamp, quindi non è necessario aggiungerlomarca temporale Formattatore.

Registrazione degli errori

Per impostazione predefinita, il formattatore converte il metacampo err di un'istanza Error in Campo ECSError .Per esempioesempio

winston-registrazione.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 });

La gestione speciale del metacampo err può essere disabilitata tramite l'opzione convertErr: false:

winston-registrazione.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 });

Richiesta HTTP e registrazione delle risposte

Utilizzando l'opzione convertReqRes: true, il formattatore convertirà automaticamente il core Node.js quando viene passato rispettivamente come metafield req e res. richiesta Erisposta oggetto.

winston-registrazione.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. Utilizzare l'opzione convertReqRes
  2. Registra i metacampi req e/o res

Questo utilizzerà Campi HTTP ECS Genera un registro contenente informazioni sulla richiesta e sulla risposta.Per esempioesempio

Sopra, dobbiamo accedere http://localhost:3000 Solo allora potrai vedere le informazioni sul giorno mostrate sopra.

Utilizza APM per la correlazione dei log

Questo ECS formattatore di log conAPM elastico integrato.Se l'applicazione Node utilizzaAgente APM elastico Node.js, vengono aggiunti diversi campi al record di log per correlare il servizio APM o tracciare e registrare i dati:

  • Verranno incluse le istruzioni di registro (come logger.info(...)) chiamate quando si traccia attualmente uno spancampi di tracciamento— trace.id, transaction.id, span.id.
  • Più campi identificativi del servizio, determinati o configurati sull'agente APM, consentono il collegamento incrociato tra servizi e log in Kibana: service.name, service.version, service.environment, service.node.name.
  • event.dataset è abilitato nelle applicazioni Elastic ObservabilityRilevamento anomalie della velocità di registro

Ad esempio, corri esempi/http-con-elastic-apm.js Ecurl -i localhost:3000/ Viene prodotto un record di registro contenente il seguente contenuto:

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

Questi ID corrispondono ai dati di tracciamento riportati dall'agente APM.

L'integrazione con Elastic APM può essere disabilitata esplicitamente tramite l'opzione apmIntegration: false, ad esempio:

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

Limitazioni e note

specifica di registrazione ecs Si consiglia che i primi tre campi nel record di log siano @timestamp, log.level e message. A partire dalla versione 1.5.0, questo formattatore non segue questa raccomandazione. Ciò è possibile ma richiede la creazione di un nuovo oggetto in ecsFields per ogni record di log. Dato che l'ordine dei campi di registrazione ecs è finalizzato alla leggibilità e non influisce sull'interoperabilità, si è deciso di dare priorità alle prestazioni.

fare riferimento a

ecsFormat([opzioni])

  • opzioni {type-object} supporta le seguenti opzioni:
    • convertErr {type-boolean} Indica se convertire il campo err del record nel campo di errore ECS.valore di default:VERO.
    • convertReqRes {type-boolean} Indica se registrare i campi di richiesta e risposta HTTP req e res nei campi HTTP, User-Agent e URL di ECS.valore di default:falso。
    • apmIntegration {type-boolean} Indica se abilitare l'integrazione dell'agente APM.valore di default:VERO.
    • serviceName {type-string} valore "service.name". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceVersion {type-string} valore "service.version". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceEnvironment {type-string} valore "service.environment". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceNodeName {type-string} valore "service.node.name". Se specificato, qualsiasi valore dell'agente APM attivo verrà sovrascritto.
    • eventDataset {type-string} valore "event.dataset". Se specificato, il valore predefinito dell'utilizzo di ${serviceVersion} verrà sovrascritto.

Crea un formattatore per Winston che emetta il formato di registrazione ECS.Questo è un trattamentoecsFields([opzioni]) EecsStringify([opzioni]) formato unico. I due seguenti sono equivalenti:

  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([opzioni])

  • opzioni {type-object} supporta le seguenti opzioni:
    • convertErr {type-boolean} Indica se convertire il campo err del record nel campo di errore ECS.valore di default:VERO.
    • convertReqRes {type-boolean} Indica se registrare i campi di richiesta e risposta HTTP req e res nei campi HTTP, User-Agent e URL di ECS.valore di default:falso。
    • apmIntegration {type-boolean} Indica se abilitare l'integrazione dell'agente APM.valore di default:VERO.
    • serviceName {type-string} valore "service.name". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceVersion {type-string} valore "service.version". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceEnvironment {type-string} valore "service.environment". Se specificato, sovrascrive qualsiasi valore dell'agente APM attivo.
    • serviceNodeName {type-string} valore "service.node.name". Se specificato, qualsiasi valore dell'agente APM attivo verrà sovrascritto.
    • eventDataset {type-string} valore "event.dataset". Se specificato, l'impostazione predefinita dell'utilizzo di ${serviceVersion} verrà sovrascritta.

Creare un formattatore per Winston che converta i campi sull'oggetto delle informazioni di registrazione nel formato di registrazione ECS.

ecsStringify([opzioni])

Crea un formattatore per Winston per stringere/serializzare i record di log in JSON.

Questo è simile a logform.json(). Entrambi utilizzano il pacchetto safe-stable-stringify per generare JSON. Alcune differenze:

  • Questo stringifier salta la serializzazione del campo level perché non è un campo ECS.
  • Winston fornisce un sostituto che converte bigint in string. Il motivo è che il parser JavaScript JSON perde precisione durante l'analisi dei bigint. L'obiezione è che BigInt cambia il tipo in stringa invece che in numero. Attualmente, questo stringifier non converte BitInt in stringa.