Κοινή χρήση τεχνολογίας

Elasticsearch: Node.js ECS Logging - Winston

2024-07-12

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

Αυτή είναι η συνέχεια του προηγούμενου άρθρου "Elasticsearch: Node.js ECS Logging - PinoΣυνέχεια του Συνεχίζουμε το προηγούμενο άρθρο για να μιλήσουμε για τη χρήση του πακέτου Winston για στόχευση Node.js Η εφαρμογή δημιουργεί ECS για να ταιριάζει με την ημέρα.Αυτό το πακέτο Node.js είναιWinston LoggerΠαρέχεται μορφοποιητής, με Καταγραφή Elastic Common Schema (ECS). σύμφωνος.συνδυασμόςFilebeat Αποστολέας, μπορείτε να παρακολουθείτε όλα τα αρχεία καταγραφής από ένα μέρος στην Elastic Stack. Υποστήριξη έκδοσης winston 3.x >=3.3.3.

στήνω

Εγκαθιστώ

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

Διαμόρφωση

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') });
  • Περάστε τον μορφοποιητή ECS στον Winston.

Το αποτέλεσμα της εκτέλεσης του παραπάνω κώδικα είναι:

Ρύθμιση παραμέτρων 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. Χρησιμοποιήστε την είσοδο ροής αρχείων για να διαβάσετε γραμμές από ένα ενεργό αρχείο καταγραφής.
  2. Εάν προκύψει διένεξη, οι τιμές του αποκωδικοποιημένου αντικειμένου JSON θα αντικαταστήσουν τα πεδία που προσθέτει κανονικά το Filebeat (τύπος, πηγή, μετατόπιση κ.λπ.).
  3. Εάν παρουσιαστεί σφάλμα κατάργησης JSON, το Filebeat θα προσθέσει τα κλειδιά "error.message" και "error.type: json".
  4. Το Filebeat θα αφαιρέσει αναδρομικά τα πλήκτρα με τελείες από το αποκωδικοποιημένο JSON και θα το επεκτείνει σε μια ιεραρχική δομή αντικειμένου.
  5. Οι επεξεργαστές βελτιώνουν τα δεδομένα σας.Βλέπωεπεξεργαστές να μάθω περισσότερα.

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

Για περισσότερες πληροφορίες, βλ Αναφορά Filebeat

πώς να χρησιμοποιήσετε

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. Δείτε παρακάτω τις διαθέσιμες επιλογές.
node winston-logging.js | jq .

Εκτελέστε αυτό το σενάριο (διαθέσιμο στοεδώαποκτηθεί) θα παράγει έξοδο καταγραφής παρόμοια με τα παραπάνω.

Ο μορφοποιητής είναι υπεύθυνος για τη σειριοποίηση των δεδομένων σε JSON, επομένως δεν χρειάζεται να προσθέσετε json Μορφοποιητής.Επιπλέον, ο μορφοποιητής δημιουργεί αυτόματα τη χρονική σήμανση, επομένως δεν χρειάζεται να προσθέσετεχρονική σήμανση Μορφοποιητής.

Σφάλμα καταγραφής

Από προεπιλογή, ο μορφοποιητής μετατρέπει το μεταπεδίο err μιας παρουσίας σφάλματος σε Πεδίο σφάλματος ECSE .Για παράδειγμαπαράδειγμα

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 μπορεί να απενεργοποιηθεί μέσω της επιλογής 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 });

Καταγραφή αιτημάτων και απαντήσεων HTTP

Χρησιμοποιώντας την επιλογή convertReqRes: true, ο μορφοποιητής θα μετατρέψει αυτόματα τον πυρήνα Node.js όταν μεταβιβαστεί ως μεταπεδία req και res αντίστοιχα. αίτηση καιαπάντηση αντικείμενο.

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. Χρησιμοποιήστε την επιλογή convertReqRes
  2. Καταγράψτε τα μεταπεδία απαίτησης και/ή res

Αυτό θα χρησιμοποιήσει Πεδία HTTP ECS Δημιουργεί ένα αρχείο καταγραφής που περιέχει πληροφορίες αιτημάτων και απαντήσεων.Για παράδειγμαπαράδειγμα

Πάνω, πρέπει να έχουμε πρόσβαση http://localhost:3000 Μόνο τότε μπορείτε να δείτε τις πληροφορίες ημέρας που εμφανίζονται παραπάνω.

Χρησιμοποιήστε το APM για συσχέτιση αρχείων καταγραφής

Αυτό ECS μορφοποιητής αρχείων καταγραφής μεΕλαστικό APM ολοκληρωμένο.Εάν η εφαρμογή Node σας χρησιμοποιείNode.js Elastic APM Agent, πολλά πεδία προστίθενται στην εγγραφή αρχείου καταγραφής για να συσχετίσουν την υπηρεσία APM ή τα δεδομένα παρακολούθησης και καταγραφής:

  • Οι δηλώσεις καταγραφής (όπως το logger.info(...)) που καλούνται κατά την τρέχουσα ανίχνευση ενός εύρους θα περιλαμβάνουνπεδία παρακολούθησης— trace.id,transaction.id,span.id.
  • Πολλαπλά πεδία αναγνωριστικού υπηρεσίας, που καθορίζονται ή έχουν ρυθμιστεί στον πράκτορα APM, επιτρέπουν τη διασύνδεση μεταξύ υπηρεσιών και αρχείων καταγραφής στο Kibana — service.name, service.version, service.environment, service.node.name.
  • Το event.dataset είναι ενεργοποιημένο σε εφαρμογές Elastic ObservabilityΑνίχνευση ανωμαλίας ρυθμού καταγραφής

Για παράδειγμα, τρέξτε παραδείγματα/http-with-elastic-apm.js καιcurl -i localhost:3000/ Παράγεται ένα αρχείο καταγραφής που περιέχει το ακόλουθο περιεχόμενο:

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

Αυτά τα αναγνωριστικά ταιριάζουν με τα δεδομένα παρακολούθησης που αναφέρονται από τον πράκτορα APM.

Η ενσωμάτωση με το Elastic APM μπορεί να απενεργοποιηθεί ρητά μέσω της επιλογής apmIntegration: false, για παράδειγμα:

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

Περιορισμοί και Σημειώσεις

προδιαγραφή ecs-logging Συνιστάται τα τρία πρώτα πεδία στην εγγραφή καταγραφής να είναι @timestamp, log.level και message. Ξεκινώντας με την έκδοση 1.5.0, αυτός ο μορφοποιητής δεν ακολουθεί αυτήν τη σύσταση. Αυτό είναι δυνατό, αλλά απαιτεί τη δημιουργία ενός νέου αντικειμένου στο ecsFields για κάθε εγγραφή καταγραφής. Δεδομένου ότι η σειρά των πεδίων ecs-logging είναι για αναγνωσιμότητα και δεν επηρεάζει τη διαλειτουργικότητα, αποφασίστηκε να δοθεί προτεραιότητα στην απόδοση.

αναφέρομαι σε

ecsFormat([επιλογές])

  • επιλογές {type-object} υποστηρίζει τις ακόλουθες επιλογές:
    • convertErr {type-boolean} Εάν θα μετατραπεί το πεδίο err της εγγραφής στο πεδίο σφάλματος ECS.Προεπιλεγμένη τιμή:αληθής.
    • convertReqRes {type-boolean} Εάν θα καταγραφούν τα πεδία αιτήματος και απάντησης HTTP req και res στα πεδία ECS HTTP, User-Agent και URL.Προεπιλεγμένη τιμή:ψευδής.
    • apmIntegration {type-boolean} Αν θα ενεργοποιηθεί η ενσωμάτωση πράκτορα APM.Προεπιλεγμένη τιμή:αληθής.
    • serviceName {type-string} τιμή "service.name". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceVersion {type-string} τιμή "service.version". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceEnvironment {type-string} τιμή "service.environment". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceNodeName {type-string} τιμή "service.node.name". Εάν καθορίζεται, οποιαδήποτε τιμή από τον ενεργό παράγοντα APM θα αντικατασταθεί.
    • τιμή eventDataset {type-string} "event.dataset". Εάν ορίζεται, η προεπιλεγμένη τιμή της χρήσης ${serviceVersion} θα παρακαμφθεί.

Δημιουργήστε έναν μορφοποιητή για το winston που εκπέμπει μορφή καταγραφής ECS.Αυτή είναι μια θεραπείαecsFields([επιλογές]) καιecsStringify([επιλογές]) ενιαία μορφή. Τα ακόλουθα δύο είναι ισοδύναμα:

  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([επιλογές])

  • επιλογές {type-object} υποστηρίζει τις ακόλουθες επιλογές:
    • convertErr {type-boolean} Εάν θα μετατραπεί το πεδίο err της εγγραφής στο πεδίο σφάλματος ECS.Προεπιλεγμένη τιμή:αληθής.
    • convertReqRes {type-boolean} Εάν θα καταγραφούν τα πεδία αιτήματος και απάντησης HTTP req και res στα πεδία ECS HTTP, User-Agent και URL.Προεπιλεγμένη τιμή:ψευδής.
    • apmIntegration {type-boolean} Αν θα ενεργοποιηθεί η ενσωμάτωση πράκτορα APM.Προεπιλεγμένη τιμή:αληθής.
    • serviceName {type-string} τιμή "service.name". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceVersion {type-string} τιμή "service.version". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceEnvironment {type-string} τιμή "service.environment". Εάν καθορίζεται, παρακάμπτει οποιαδήποτε τιμή από τον ενεργό παράγοντα APM.
    • serviceNodeName {type-string} τιμή "service.node.name". Εάν καθορίζεται, οποιαδήποτε τιμή από τον ενεργό παράγοντα APM θα αντικατασταθεί.
    • τιμή eventDataset {type-string} "event.dataset". Εάν ορίζεται, η προεπιλεγμένη ρύθμιση της χρήσης ${serviceVersion} θα παρακαμφθεί.

Δημιουργήστε έναν μορφοποιητή για το winston που μετατρέπει τα πεδία στο αντικείμενο πληροφοριών καταγραφής σε μορφή καταγραφής ECS.

ecsStringify([επιλογές])

Δημιουργήστε έναν μορφοποιητή για το winston για τη συμβολοσειοποίηση/σειριοποίηση εγγραφών καταγραφής σε JSON.

Αυτό είναι παρόμοιο με το logform.json(). Και οι δύο χρησιμοποιούν το πακέτο safe-stable-stringify για να δημιουργήσουν JSON. Μερικές διαφορές:

  • Αυτός ο συμβολοσειριστής παραλείπει τη σειριοποίηση του πεδίου επιπέδου επειδή δεν είναι πεδίο ECS.
  • Η Winston παρέχει έναν αντικαταστάτη που μετατρέπει το bigint σε συμβολοσειρά. Ο λόγος για αυτό είναι ότι ο αναλυτής JSON JavaScript χάνει την ακρίβεια κατά την ανάλυση bigints. Η ένσταση είναι ότι το BigInt αλλάζει τον τύπο σε συμβολοσειρά αντί για αριθμό. Επί του παρόντος, αυτός ο συμβολοσειρωτής δεν μετατρέπει το BitInt σε συμβολοσειρά.