Teknologian jakaminen

Elasticsearch: Node.js ECS Logging - Winston

2024-07-12

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

Tämä on jatkoa edelliselle artikkelille "Elasticsearch: Node.js ECS Logging - PinoJatkamme edellistä artikkelia Winston-paketin käyttämisestä kohdistamiseen Node.js Sovellus luo ECS:n päivän mukaan.Tämä Node.js-paketti onWinston metsuriMukana on muotoilulaite Elastic Common Schema (ECS) -lokikirjaus yhteensopiva.yhdistääFilebeat Sender, voit seurata kaikkia lokeja yhdestä paikasta elastisessa pinossa. Tuki winston 3.x -versiolle >=3.3.3.

perustaa

Asentaa

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

Kokoonpano

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') });
  • Ohjaa ECS-muotoilija winstonille.

Yllä olevan koodin suorittamisen tulos on:

Määritä 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. Käytä tiedostovirran syötettä rivien lukemiseen toimintalokitiedostosta.
  2. Jos ristiriita ilmenee, dekoodatun JSON-objektin arvot korvaavat kentät, jotka Filebeat tavallisesti lisää (tyyppi, lähde, offset jne.).
  3. Jos tapahtuu JSON-poistovirhe, Filebeat lisää "error.message"- ja "error.type: json"-avaimet.
  4. Filebeat poistaa rekursiivisesti pisteavaimet dekoodatusta JSONista ja laajentaa sen hierarkkiseksi objektirakenteeksi.
  5. Prosessorit parantavat tietojasi.Katsoprosessorit oppia lisää.

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

Katso lisätietoja Filebeat-viittaus

kuinka käyttää

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. Katso käytettävissä olevat vaihtoehdot alta.
node winston-logging.js | jq .

Suorita tämä komentosarja (saatavilla osoitteessatässäsaatu) tuottaa yllä olevan kaltaisen lokitulosteen.

Muotoilija on vastuussa tietojen sarjoittamisesta JSON-muotoon, joten sinun ei tarvitse lisätä json Muotoilija.Lisäksi muotoilija luo automaattisesti aikaleiman, joten sinun ei tarvitse lisätäaikaleima Muotoilija.

Virhe kirjaamisessa

Oletusarvoisesti muotoilija muuntaa Error-esiintymän err-metakentän muotoon ECSE-virhekenttä .Esimerkiksiesimerkki

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-metakentän erikoiskäsittely voidaan poistaa käytöstä convertErr: false -vaihtoehdolla:

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-pyyntöjen ja vastausten kirjaaminen

Käyttämällä convertReqRes: true -vaihtoehtoa muotoilija muuntaa automaattisesti Node.js-ytimen, kun se lähetetään req- ja res-metakenttinä. pyyntö javastaus esine.

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. Käytä convertReqRes-vaihtoehtoa
  2. Record req ja/tai res metakentät

Tämä käyttää ECS HTTP-kentät Luo lokin, joka sisältää pyyntö- ja vastaustiedot.Esimerkiksiesimerkki

Ylhäällä meidän on päästävä http://localhost:3000 Vasta sitten näet yllä näkyvät päivätiedot.

Käytä APM:ää lokikorrelaatioon

Tämä ECS lokiformaatin kanssaElastinen APM integroitu.Jos Node-sovelluksesi käyttääNode.js Elastinen APM-agentti, lokitietueeseen lisätään useita kenttiä APM-palvelun tai jäljitys- ja lokitietojen korreloimiseksi:

  • Lokilausekkeet (kuten logger.info(...)), joita kutsutaan, kun tällä hetkellä jäljitetään jänneväliä, sisältävätseurantakentät- trace.id、transaction.id、span.id.
  • Useat APM-agentin määrittämät tai määrittämät palvelutunnistekentät mahdollistavat Kibanan palveluiden ja lokien välisen ristiinlinkityksen — service.name, service.version, service.environment, service.node.name.
  • event.dataset on käytössä elastisen havainnoinnin sovelluksissaLokinopeuden poikkeamien havaitseminen

Esimerkiksi juosta examples/http-with-elastic-apm.js jacurl -i localhost:3000/ Lokitietue, joka sisältää seuraavan sisällön, luodaan:

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

Nämä tunnukset vastaavat APM-agentin ilmoittamia seurantatietoja.

Integrointi Elastic APM:n kanssa voidaan poistaa eksplisiittisesti käytöstä apmIntegration: false -vaihtoehdolla, esimerkiksi:

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

Rajoitukset ja huomautukset

ecs-logging eritelmä On suositeltavaa, että lokitietueen kolme ensimmäistä kenttää ovat @timestamp, log.level ja message. Versiosta 1.5.0 alkaen tämä muotoiluohjelma ei noudata tätä suositusta. Tämä on mahdollista, mutta vaatii uuden objektin luomisen ecsFieldsissä jokaiselle lokitietueelle. Koska ecs-lokikenttien järjestys on luettavuuden vuoksi eikä vaikuta yhteentoimivuuteen, suorituskyky päätettiin priorisoida.

viitata

ecsFormat([valinnat])

  • asetukset {type-object} tukee seuraavia vaihtoehtoja:
    • convertErr {type-boolean} Muunnetaanko tietueen err-kenttä ECS-virhekenttään.oletusarvo:totta.
    • convertReqRes {type-boolean} Määrittää, kirjataanko req- ja res HTTP-pyyntö- ja vastauskentät ECS HTTP-, User-Agent- ja URL-kenttiin.oletusarvo:väärä.
    • apmIntegration {type-boolean} Määrittää, otetaanko APM-agentin integrointi käyttöön.oletusarvo:totta.
    • serviceName {type-string} "palvelun.nimi" arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceVersion {type-string} "service.version" -arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceEnvironment {type-string} "service.environment"-arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceNodeName {type-string} "palvelu.solmun.nimi" arvo. Jos määritetään, kaikki aktiivisen APM-agentin arvot korvataan.
    • eventDataset {type-string} "event.dataset" arvo. Jos määritetään, ${serviceVersion}-oletusarvo ohitetaan.

Luo winstonille formatteri, joka lähettää ECS-lokimuotoa.Tämä on hoitoaecsFields([valinnat]) jaecsStringify([valinnat]) yksi muoto. Seuraavat kaksi ovat vastaavia:

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

  • asetukset {type-object} tukee seuraavia vaihtoehtoja:
    • convertErr {type-boolean} Muunnetaanko tietueen err-kenttä ECS-virhekenttään.oletusarvo:totta.
    • convertReqRes {type-boolean} Määrittää, kirjataanko req- ja res HTTP-pyyntö- ja vastauskentät ECS HTTP-, User-Agent- ja URL-kenttiin.oletusarvo:väärä.
    • apmIntegration {type-boolean} Määrittää, otetaanko APM-agentin integrointi käyttöön.oletusarvo:totta.
    • serviceName {type-string} "palvelun.nimi" arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceVersion {type-string} "service.version" -arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceEnvironment {type-string} "service.environment"-arvo. Jos määritetty, ohittaa minkä tahansa aktiivisen APM-agentin arvon.
    • serviceNodeName {type-string} "palvelu.solmun.nimi" arvo. Jos määritetään, kaikki aktiivisen APM-agentin arvot korvataan.
    • eventDataset {type-string} "event.dataset" arvo. Jos määritetty, oletusasetus käyttää ${serviceVersion} ohitetaan.

Luo winstonille muotoilija, joka muuntaa lokitietoobjektin kentät ECS-lokimuotoon.

ecsStringify([valinnat])

Luo muotoilija winstonille lokitietueiden juunien juunittamiseksi/sarjoittamiseksi JSON-muotoon.

Tämä on samanlainen kuin logform.json(). Molemmat käyttävät safe-stable-stringify-pakettia JSONin luomiseen. Joitakin eroja:

  • Tämä stringifier ohittaa tasokentän sarjoitamisen, koska se ei ole ECS-kenttä.
  • Winston tarjoaa korvaajan, joka muuntaa bigintin merkkijonoksi. Syynä tähän on se, että JavaScript JSON-jäsennin menettää tarkkuuden jäsennettäessä biginttejä. Vastaväite on, että BigInt muuttaa tyypin merkkijonoksi numeron sijaan. Tällä hetkellä tämä stringifier ei muunna BitIntiä merkkijonoksi.