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.
- npm install @elastic/ecs-winston-format
- npm install winston
winston-logging.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- format: ecsFormat(/* options */), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- logger.info('hi');
- logger.error('oops there is a problem', { err: new Error('boom') });
Le résultat de l’exécution du code ci-dessus est :
Filebeat 7.16+
fichierbeat.yml
- filebeat.inputs:
- - type: filestream # 1
- paths: /path/to/logs.json
- parsers:
- - ndjson:
- overwrite_keys: true # 2
- add_error_key: true # 3
- expand_keys: true # 4
-
- processors: // 5
- - add_host_metadata: ~
- - add_cloud_metadata: ~
- - add_docker_metadata: ~
- - add_kubernetes_metadata: ~
Filebeat < 7.16
fichierbeat.yml
- filebeat.inputs:
- - type: log
- paths: /path/to/logs.json
- json.keys_under_root: true
- json.overwrite_keys: true
- json.add_error_key: true
- json.expand_keys: true
-
- processors:
- - add_host_metadata: ~
- - add_cloud_metadata: ~
- - add_docker_metadata: ~
- - add_kubernetes_metadata: ~
Pour plus d'informations, voir Référence de battement de fichier。
winston-logging.js
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- level: 'info',
- format: ecsFormat(/* options */), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- logger.info('hi');
- logger.error('oops there is a problem', { foo: 'bar' });
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.
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
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
- const logger = winston.createLogger({
- format: ecsFormat(),
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const myErr = new Error('boom');
- 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
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
- const logger = winston.createLogger({
- format: ecsFormat({convertErr: false} ),
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const myErr = new Error('boom');
- logger.info('oops', { err: myErr });
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
- const http = require('http');
- const winston = require('winston');
- const { ecsFormat } = require('@elastic/ecs-winston-format');
-
- const logger = winston.createLogger({
- level: 'info',
- format: ecsFormat({ convertReqRes: true }), // 1
- transports: [
- new winston.transports.Console()
- ]
- });
-
- const server = http.createServer(handler);
- server.listen(3000, () => {
- logger.info('listening at http://localhost:3000')
- });
-
- function handler (req, res) {
- res.setHeader('Foo', 'Bar');
- res.end('ok');
- logger.info('handled request', { req, res }); // 2
- }
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.
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 :
Par exemple, exécutez exemples/http-avec-elastic-apm.js etcurl -i localhost:3000/ Un enregistrement de journal contenant le contenu suivant est produit :
- % node examples/http-with-elastic-apm.js | jq .
- ...
- "service.name": "http-with-elastic-apm",
- "service.version": "1.4.0",
- "service.environment": "development",
- "event.dataset": "http-with-elastic-apm"
- "trace.id": "7fd75f0f33ff49aba85d060b46dcad7e",
- "transaction.id": "6c97c7c1b468fa05"
- }
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 :
- const logger = winston.createLogger({
- format: ecsFormat({ apmIntegration: false }),
- // ...
- })
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.
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 :
- const { ecsFormat, ecsFields, ecsStringify } = require('@elastic/ecs-winston-format');
- const winston = require('winston');
-
- const logger = winston.createLogger({
- format: ecsFormat(/* options */),
- // ...
- });
-
- const logger = winston.createLogger({
- format: winston.format.combine(
- ecsFields(/* options */),
- ecsStringify()
- ),
- // ...
- });
Créez un formateur pour Winston qui convertit les champs de l'objet d'informations de journalisation au format de journalisation ECS.
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 :