Partage de technologie

Elasticsearch : journalisation ECS Node.js - Winston

2024-07-12

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

Ceci est la suite de l'article précédent "Elasticsearch : journalisation ECS Node.js - Pino" suite de. Nous continuons l'article précédent pour parler de l'utilisation du package Winston pour cibler. Node.js L'application génère des ECS pour correspondre à la journée.Ce package Node.js estenregistreur WinstonUn formateur est fourni, avec Journalisation Elastic Common Schema (ECS) compatible.combinerBattement de fichier Sender, vous pouvez surveiller tous les journaux à partir d'un seul endroit dans la Suite Elastic. Prise en charge de la version Winston 3.x >=3.3.3.

installation

Installer

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

Configuration

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') });
  • Transmettez le formateur ECS à Winston.

Le résultat de l’exécution du code ci-dessus est :

Configurer Filebeat

Filebeat 7.16+

fichierbeat.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. Utilisez l'entrée filestream pour lire les lignes d'un fichier journal actif.
  2. Si un conflit survient, les valeurs de l'objet JSON décodé écraseront les champs que Filebeat ajoute normalement (type, source, offset, etc.).
  3. Si une erreur de démarshalling JSON se produit, Filebeat ajoutera les clés "error.message" et "error.type: json".
  4. Filebeat supprimera de manière récursive les clés de point du JSON décodé et l'étendra dans une structure d'objet hiérarchique.
  5. Les processeurs améliorent vos données.Voirprocesseurs pour apprendre plus.

Filebeat < 7.16

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

Pour plus d'informations, voir Référence de battement de fichier

comment utiliser

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. Voir les options disponibles ci-dessous.
node winston-logging.js | jq .

Exécutez ce script (disponible suriciobtenu) produira une sortie de journal similaire à celle ci-dessus.

Le formateur est responsable de la sérialisation des données en JSON, vous n'avez donc pas besoin d'ajouter json Formateur.De plus, le formateur génère automatiquement l'horodatage, vous n'avez donc pas besoin d'ajouterhorodatage Formateur.

Journalisation des erreurs

Par défaut, le formateur convertit le métachamp err d'une instance d'Erreur en Champ d'erreur ECSError .Par exempleexemple

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

La gestion spéciale du métachamp err peut être désactivée via l'option 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 });

Journalisation des requêtes et des réponses HTTP

En utilisant l'option convertReqRes: true, le formateur convertira automatiquement le noyau Node.js lorsqu'il sera transmis respectivement en tant que champs méta req et res. demande etréponse objet.

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. Utilisez l'option convertReqRes
  2. Enregistrer les métachamps req et/ou res

Cela utilisera Champs HTTP ECS Génère un journal contenant des informations sur les demandes et les réponses.Par exempleexemple

Ci-dessus, nous devons accéder http://localhost:3000 Ce n'est qu'alors que vous pourrez voir les informations sur le jour affichées ci-dessus.

Utiliser APM pour la corrélation des journaux

ce SCE formateur de journaux avecAPM élastique intégré.Si votre application Node utiliseAgent APM élastique Node.js, plusieurs champs sont ajoutés à l'enregistrement du journal pour corréler le service APM ou les données de trace et de journalisation :

  • Les instructions de journal (telles que logger.info(...)) appelées lors du traçage actuel d'une étendue inclurontchamps de suivi— trace.id, transaction.id, span.id.
  • Plusieurs champs d'identifiant de service, déterminés ou configurés sur l'agent APM, permettent la création de liens croisés entre les services et les journaux dans Kibana : service.name, service.version, service.environment, service.node.name.
  • event.dataset est activé dans les applications Elastic ObservabilityDétection des anomalies de taux de journalisation

Par exemple, exécutez exemples/http-avec-elastic-apm.js etcurl -i localhost:3000/ Un enregistrement de journal contenant le contenu suivant est produit :

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

Ces identifiants correspondent aux données de suivi signalées par l'agent APM.

L'intégration avec Elastic APM peut être explicitement désactivée via l'option apmIntegration: false, par exemple :

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

Limites et remarques

spécification de journalisation ecs Il est recommandé que les trois premiers champs de l'enregistrement du journal soient @timestamp, log.level et message. À partir de la version 1.5.0, ce formateur ne suit pas cette recommandation. Ceci est possible mais nécessite la création d'un nouvel objet dans ecsFields pour chaque enregistrement de journal. Étant donné que l’ordre des champs de journalisation ecs est destiné à la lisibilité et n’affecte pas l’interopérabilité, il a été décidé de donner la priorité aux performances.

faire référence à

ecsFormat([options])

  • options {type-object} prend en charge les options suivantes :
    • convertErr {type-boolean} S'il faut convertir le champ d'erreur de l'enregistrement en champ d'erreur ECS.valeur par défaut:vrai.
    • convertReqRes {type-boolean} Indique s'il faut enregistrer les champs de requête et de réponse HTTP req et res dans les champs ECS HTTP, User-Agent et URL.valeur par défaut:FAUX.
    • apmIntegration {type-boolean} S'il faut activer l'intégration de l'agent APM.valeur par défaut:vrai.
    • valeur serviceName {type-string} "service.name". Si spécifié, remplace toute valeur de l’agent APM actif.
    • valeur serviceVersion {type-string} "service.version". Si spécifié, remplace toute valeur de l’agent APM actif.
    • serviceEnvironment {type-string} Valeur "service.environment". Si spécifié, remplace toute valeur de l’agent APM actif.
    • valeur serviceNodeName {type-string} "service.node.name". Si spécifié, toute valeur de l’agent APM actif sera écrasée.
    • eventDataset {type-string} Valeur "event.dataset". Si elle est spécifiée, la valeur par défaut d'utilisation de ${serviceVersion} sera remplacée.

Créez un formateur pour Winston qui émet le format de journalisation ECS.C'est un traitementecsFields([options]) etecsStringify([options]) format unique. Les deux suivants sont équivalents :

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

  • options {type-object} prend en charge les options suivantes :
    • convertErr {type-boolean} S'il faut convertir le champ d'erreur de l'enregistrement en champ d'erreur ECS.valeur par défaut:vrai.
    • convertReqRes {type-boolean} Indique s'il faut enregistrer les champs de requête et de réponse HTTP req et res dans les champs ECS HTTP, User-Agent et URL.valeur par défaut:FAUX.
    • apmIntegration {type-boolean} S'il faut activer l'intégration de l'agent APM.valeur par défaut:vrai.
    • valeur serviceName {type-string} "service.name". Si spécifié, remplace toute valeur de l’agent APM actif.
    • valeur serviceVersion {type-string} "service.version". Si spécifié, remplace toute valeur de l’agent APM actif.
    • serviceEnvironment {type-string} Valeur "service.environment". Si spécifié, remplace toute valeur de l’agent APM actif.
    • valeur serviceNodeName {type-string} "service.node.name". Si spécifié, toute valeur de l’agent APM actif sera écrasée.
    • eventDataset {type-string} Valeur "event.dataset". S'il est spécifié, le paramètre par défaut d'utilisation de ${serviceVersion} sera remplacé.

Créez un formateur pour Winston qui convertit les champs de l'objet d'informations de journalisation au format de journalisation ECS.

ecsStringify([options])

Créez un formateur pour Winston afin de chaîner/sérialiser les enregistrements de journaux en JSON.

Ceci est similaire à logform.json(). Ils utilisent tous deux le package safe-stable-stringify pour générer du JSON. Quelques différences :

  • Ce stringifier ignore la sérialisation du champ de niveau car il ne s'agit pas d'un champ ECS.
  • Winston fournit un remplaçant qui convertit bigint en chaîne. La raison en est que l'analyseur JavaScript JSON perd en précision lors de l'analyse des bigints. L'objection est que BigInt change le type en chaîne au lieu de nombre. Actuellement, ce stringifier ne convertit pas BitInt en chaîne.