Technologieaustausch

Elasticsearch: Node.js ECS-Protokollierung – Winston

2024-07-12

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

Dies ist eine Fortsetzung des vorherigen Artikels „Elasticsearch: Node.js ECS-Protokollierung – Pino” Fortsetzung von. Wir setzen den vorherigen Artikel fort, um über die Verwendung des Winston-Pakets zum Zielen zu sprechen Node.js Die Anwendung generiert ECS passend zum Tag.Dieses Node.js-Paket istWinston LoggerEin Formatierer wird mitgeliefert ECS-Protokollierung (Elastic Common Schema). kompatibel.kombinierenFilebeat Absender können Sie alle Protokolle von einem Ort im Elastic Stack aus überwachen. Unterstützt Winston 3.x-Version >=3.3.3.

aufstellen

Installieren

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

Aufbau

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') });
  • Übergeben Sie den ECS-Formatierer an Winston.

Das Ergebnis der Ausführung des obigen Codes ist:

Konfigurieren Sie 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. Verwenden Sie die Filestream-Eingabe, um Zeilen aus einer aktiven Protokolldatei zu lesen.
  2. Wenn ein Konflikt auftritt, überschreiben die Werte des dekodierten JSON-Objekts die Felder, die Filebeat normalerweise hinzufügt (Typ, Quelle, Offset usw.).
  3. Wenn ein JSON-Unmarshalling-Fehler auftritt, fügt Filebeat die Schlüssel „error.message“ und „error.type: json“ hinzu.
  4. Filebeat entfernt rekursiv die Punkttasten aus dem dekodierten JSON und erweitert es in eine hierarchische Objektstruktur.
  5. Prozessoren verbessern Ihre Daten.SehenProzessoren um mehr zu lernen.

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

Weitere Informationen finden Sie unter Filebeat-Referenz

wie benutzt man

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. Verfügbare Optionen finden Sie weiter unten.
node winston-logging.js | jq .

Führen Sie dieses Skript aus (verfügbar unterHiererhalten) erzeugt eine Protokollausgabe ähnlich der oben genannten.

Der Formatierer ist für die Serialisierung der Daten in JSON verantwortlich, sodass Sie ihn nicht hinzufügen müssen json Formatierer.Darüber hinaus generiert der Formatierer automatisch den Zeitstempel, sodass Sie ihn nicht hinzufügen müssenZeitstempel Formatierer.

Fehlerprotokollierung

Standardmäßig konvertiert der Formatierer das err-Metafeld einer Error-Instanz in ECSError-Feld .Zum BeispielBeispiel

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

Die spezielle Behandlung des err-Metafelds kann über die Option „convertErr: false“ deaktiviert werden:

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

Protokollierung von HTTP-Anfragen und -Antworten

Mit der Option „convertReqRes: true“ konvertiert der Formatierer automatisch den Node.js-Kern, wenn er als req- bzw. res-Metafelder übergeben wird. Anfrage UndAntwort Objekt.

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. Verwenden Sie die Option „convertReqRes“.
  2. Erfassen Sie die Metafelder „req“ und/oder „res“.

Dies wird verwendet ECS-HTTP-Felder Erstellt ein Protokoll mit Anforderungs- und Antwortinformationen.Zum BeispielBeispiel

Oben müssen wir zugreifen http://localhost:3000 Erst dann können Sie die oben angezeigten Tagesinformationen sehen.

Verwenden Sie APM für die Protokollkorrelation

Das ECS Protokollformatierer mitElastisches APM integriert.Wenn Ihre Node-Anwendung verwendetElastischer APM-Agent von Node.js, werden dem Protokolldatensatz mehrere Felder hinzugefügt, um den APM-Dienst oder die Trace- und Protokolldaten zu korrelieren:

  • Protokollanweisungen (z. B. logger.info(...)), die beim aktuellen Verfolgen einer Spanne aufgerufen werden, umfassenTracking-Felder— trace.id, transaction.id, span.id.
  • Mehrere Service-ID-Felder, die vom APM-Agenten bestimmt oder konfiguriert werden, ermöglichen die Vernetzung zwischen Services und Protokollen in Kibana – service.name, service.version, service.environment, service.node.name.
  • event.dataset ist in Elastic Observability-Anwendungen aktiviertErkennung von Protokollratenanomalien

Zum Beispiel laufen Beispiele/http-mit-elastic-apm.js Undcurl -i localhost:3000/ Es wird ein Protokollsatz mit folgendem Inhalt erstellt:

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

Diese IDs stimmen mit den vom APM-Agenten gemeldeten Tracking-Daten überein.

Die Integration mit Elastic APM kann explizit über die Option apmIntegration: false deaktiviert werden, zum Beispiel:

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

Einschränkungen und Hinweise

ECS-Logging-Spezifikation Es wird empfohlen, dass die ersten drei Felder im Protokolldatensatz @timestamp, log.level und message sein sollten. Ab Version 1.5.0 folgt dieser Formatierer dieser Empfehlung nicht mehr. Dies ist möglich, erfordert jedoch die Erstellung eines neuen Objekts in ecsFields für jeden Protokolldatensatz. Da die Reihenfolge der ECS-Logging-Felder der Lesbarkeit dient und die Interoperabilität nicht beeinträchtigt, wurde beschlossen, der Leistung Priorität einzuräumen.

beziehen auf

ecsFormat([Optionen])

  • Optionen {type-object} unterstützt die folgenden Optionen:
    • convertErr {type-boolean} Gibt an, ob das Fehlerfeld des Datensatzes in das ECS-Fehlerfeld konvertiert werden soll.Standardwert:WAHR.
    • ConvertReqRes {type-boolean} Gibt an, ob die HTTP-Anforderungs- und Antwortfelder „req“ und „res“ in den ECS-HTTP-, User-Agent- und URL-Feldern protokolliert werden sollen.Standardwert:FALSCH.
    • apmIntegration {type-boolean} Ob die APM-Agent-Integration aktiviert werden soll.Standardwert:WAHR.
    • serviceName {type-string} „service.name“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceVersion {type-string} „service.version“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceEnvironment {type-string} „service.environment“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceNodeName {type-string} „service.node.name“-Wert. Wenn angegeben, wird jeder Wert vom aktiven APM-Agenten überschrieben.
    • eventDataset {type-string} „event.dataset“-Wert. Wenn angegeben, wird der Standardwert der Verwendung von ${serviceVersion} überschrieben.

Erstellen Sie einen Formatierer für Winston, der das ECS-Protokollierungsformat ausgibt.Dies ist eine BehandlungecsFields([Optionen]) UndecsStringify([Optionen]) Einzelformat. Die folgenden beiden sind gleichwertig:

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

  • Optionen {type-object} unterstützt die folgenden Optionen:
    • convertErr {type-boolean} Gibt an, ob das Fehlerfeld des Datensatzes in das ECS-Fehlerfeld konvertiert werden soll.Standardwert:WAHR.
    • ConvertReqRes {type-boolean} Gibt an, ob die HTTP-Anforderungs- und Antwortfelder „req“ und „res“ in den ECS-HTTP-, User-Agent- und URL-Feldern protokolliert werden sollen.Standardwert:FALSCH.
    • apmIntegration {type-boolean} Ob die APM-Agent-Integration aktiviert werden soll.Standardwert:WAHR.
    • serviceName {type-string} „service.name“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceVersion {type-string} „service.version“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceEnvironment {type-string} „service.environment“-Wert. Wenn angegeben, wird jeder Wert des aktiven APM-Agenten überschrieben.
    • serviceNodeName {type-string} „service.node.name“-Wert. Wenn angegeben, wird jeder Wert vom aktiven APM-Agenten überschrieben.
    • eventDataset {type-string} „event.dataset“-Wert. Wenn angegeben, wird die Standardeinstellung der Verwendung von ${serviceVersion} überschrieben.

Erstellen Sie einen Formatierer für Winston, der die Felder im Protokollierungsinformationsobjekt in das ECS-Protokollierungsformat konvertiert.

ecsStringify([Optionen])

Erstellen Sie einen Formatierer für Winston, um Protokolldatensätze in JSON zu stringifizieren/serialisieren.

Dies ähnelt logform.json(). Beide verwenden das Paket „safe-stable-stringify“, um JSON zu generieren. Einige Unterschiede:

  • Dieser Stringifizierer überspringt die Serialisierung des Ebenenfelds, da es sich nicht um ein ECS-Feld handelt.
  • Winston stellt einen Ersatz bereit, der Bigint in String umwandelt. Der Grund dafür ist, dass der JavaScript-JSON-Parser beim Parsen von Bigints an Präzision verliert. Der Einwand besteht darin, dass BigInt den Typ in einen String statt in eine Zahl ändert. Derzeit konvertiert dieser Stringifier BitInt nicht in einen String.