प्रौद्योगिकी साझेदारी

Elasticsearch: Node.js ECS लॉगिंग - विन्स्टन्

2024-07-12

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

इति पूर्वस्य लेखस्य निरन्तरता " " ।Elasticsearch: Node.js ईसीएस लॉगिंग - पिनो” continuation of. लक्ष्यं कर्तुं विन्स्टन्-सङ्कुलस्य उपयोगस्य विषये चर्चां कर्तुं वयं पूर्वलेखं निरन्तरं कुर्मः नोड.जस अनुप्रयोगः दिवसस्य सङ्गतिं कर्तुं ECS जनयति ।इदं Node.js संकुलम् अस्तिwinston loggerएकः स्वरूपकः प्रदत्तः अस्ति, सह लोचदार सामान्य योजना (ECS) लॉगिंग सुयोग्य।संयोजनसञ्चिकाबीट् प्रेषकः, भवान् Elastic Stack इत्यस्मिन् एकस्मात् स्थानात् सर्वाणि लॉग्स् निरीक्षितुं शक्नोति । समर्थनं winston 3.x संस्करणं >=3.3.3.

स्थापयति

प्रतिस्था

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

विन्यासः

विन्स्टन-लॉगिंग.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.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 unmarshalling त्रुटिः भवति तर्हि Filebeat "error.message" तथा "error.type: json" कीलानि योजयिष्यति ।
  4. Filebeat पुनरावर्तनीयरूपेण डिकोडेड् JSON तः डॉट् कील्स् स्ट्रिप् करिष्यति तथा च श्रेणीबद्धवब्जेक्ट् संरचनायां विस्तारयिष्यति ।
  5. संसाधकाः भवतः दत्तांशं वर्धयन्ति ।पश्यतुसंसाधकाः अधिकं ज्ञातुं ।

सञ्चिकाबीट् < 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 सन्दर्भः

कथं प्रयोगः करणीयः

विन्स्टन-लॉगिंग.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 .

एतत् स्क्रिप्ट् चालयन्तु (अत्र उपलभ्यतेअत्रप्राप्तम्) उपर्युक्तसदृशं log output उत्पादयिष्यति ।

स्वरूपकः JSON मध्ये दत्तांशस्य क्रमाङ्कनस्य उत्तरदायी अस्ति, अतः भवद्भिः योजयितुं आवश्यकता नास्ति ञ्सोन् स्वरूपकम् ।तदतिरिक्तं, स्वरूपकः स्वयमेव समयमुद्रिकां जनयति, अतः भवद्भिः योजयितुं आवश्यकता नास्तिसमयमुद्रिका स्वरूपकम् ।

त्रुटिलेखनम्

पूर्वनिर्धारितरूपेण, स्वरूपकः एकस्य Error उदाहरणस्य err मेटाफील्ड् इत्येतत् परिवर्तयति ECSError क्षेत्रम् .उदाहरणतयाउदाहरण

विन्स्टन-लॉगिंग.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 विकल्पस्य माध्यमेन अक्षमं कर्तुं शक्यते:

विन्स्टन-लॉगिंग.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 मेटाफील्ड् इति रूपेण पारितः भवति । अनुरोधः तथाप्रतिक्रिया वस्तु।

विन्स्टन-लॉगिंग.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. req तथा/वा res मेटाफील्ड्स् अभिलेखयन्तु

एतेन उपयोगः भविष्यति ECS HTTP क्षेत्राणि अनुरोधप्रतिक्रियासूचनायुक्तं लॉगं जनयति ।उदाहरणतयाउदाहरण

उपरि अस्माकं प्रवेशः आवश्यकः http://स्थानीयमेजबान:3000 तदा एव उपरि दर्शितं दिवसस्य सूचनां द्रष्टुं शक्नुवन्ति।

लॉग् सहसंबन्धाय APM इत्यस्य उपयोगं कुर्वन्तु

अयम्‌ ईसीएस log formatter सहलोचदार ए पी एम एकीकृत।यदि भवतः Node अनुप्रयोगः उपयुज्यतेNode.js लोचदार एपीएम एजेंट, एपीएम सेवा अथवा ट्रेस एण्ड् लॉग् डाटा सहसंबद्धुं लॉग् रिकार्ड् मध्ये अनेकाः क्षेत्राणि योजिताः भवन्ति:

  • वर्तमानकाले स्पैनस्य अनुसन्धानं कुर्वन् आहूताः लॉग् स्टेट्मेण्ट् (यथा logger.info(...)) समाविष्टाः भविष्यन्तिअनुसरणं क्षेत्राणि— trace.id、व्यवहार.id、span.id。
  • एपीएम एजेण्ट् द्वारा निर्धारितं वा विन्यस्तं वा बहुविधं सेवापरिचयक्षेत्रं किबाना मध्ये सेवानां लॉग्स् च मध्ये क्रॉस्-लिङ्किंग् अनुमन्यते — service.name, service.version, service.environment, service.node.name
  • event.dataset इत्येतत् Elastic Observability अनुप्रयोगेषु सक्षमम् अस्तिलॉग दर विसंगति पता लगाना

यथा धावतु उदाहरणम्/http-सह-लोचना-apm.js तथाcurl -i स्थानीयमेजबान: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. }

एते IDs एपीएम एजेण्टेन प्रतिवेदितैः अनुसरणदत्तांशैः सह मेलम् कुर्वन्ति ।

Elastic APM इत्यनेन सह एकीकरणं apmIntegration: false विकल्पस्य माध्यमेन स्पष्टतया निष्क्रियं कर्तुं शक्यते, उदाहरणार्थं:

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

सीमाः टिप्पण्याः च

ecs-logging विनिर्देशः अनुशंसितं यत् log record इत्यस्मिन् प्रथमत्रयक्षेत्राणि @timestamp, log.level, message च भवेयुः । १.५.० संस्करणात् आरभ्य अयं प्रारूपकः एतस्य अनुशंसायाः अनुसरणं न करोति । एतत् सम्भवति परन्तु प्रत्येकस्य log record कृते ecsFields मध्ये नूतनं वस्तु निर्मातुं आवश्यकम् अस्ति । ecs-logging क्षेत्राणां क्रमणं पठनीयतायै भवति, अन्तरक्रियाशीलतां न प्रभावितं करोति इति दृष्ट्वा कार्यप्रदर्शनस्य प्राथमिकताम् अददात् इति निर्णयः कृतः ।

refer to

ecsFormat ([विकल्प]) २.

  • options {type-object} निम्नलिखितविकल्पानां समर्थनं करोति:
    • convertErr {type-boolean} अभिलेखस्य त्रुटिक्षेत्रं ECS त्रुटिक्षेत्रे परिवर्तयितुं वा।पूर्वनिर्धारितं मूल्यम्:सत्यम्‌।
    • convertReqRes {type-boolean} ECS HTTP, User-Agent तथा ​​URL क्षेत्रेषु req तथा res HTTP अनुरोधं प्रतिक्रियाक्षेत्रं च लॉग् कर्तव्यं वा।पूर्वनिर्धारितं मूल्यम्:असत्य।
    • apmIntegration {type-boolean} APM एजेण्ट् एकीकरणं सक्षमं कर्तव्यं वा।पूर्वनिर्धारितं मूल्यम्:सत्यम्‌।
    • serviceName {type-string} "सेवा.नाम" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceVersion {type-string} "सेवा.संस्करण" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceEnvironment {type-string} "सेवा.पर्यावरण" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceNodeName {type-string} "सेवा.नोड.नाम" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय एपीएम एजेण्टतः यत्किमपि मूल्यं अधिलिखितं भविष्यति ।
    • eventDataset {type-string} "घटना.दत्तांशसमूह" मूल्यम्। यदि निर्दिष्टं भवति तर्हि ${serviceVersion} इत्यस्य उपयोगस्य पूर्वनिर्धारितं मूल्यं अधिलिखितं भविष्यति ।

winston कृते एकं स्वरूपकं रचयन्तु यत् ECS logging प्रारूपं उत्सर्जयति ।इति चिकित्साecsFields ([विकल्प]) 1.1. तथाecsStringify ([विकल्प]) 1.1. एक प्रारूप। निम्नलिखितद्वयं तुल्यम् अस्ति : १.

  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 ([विकल्प]) 1.1.

  • options {type-object} निम्नलिखितविकल्पानां समर्थनं करोति:
    • convertErr {type-boolean} अभिलेखस्य त्रुटिक्षेत्रं ECS त्रुटिक्षेत्रे परिवर्तयितुं वा।पूर्वनिर्धारितं मूल्यम्:सत्यम्‌।
    • convertReqRes {type-boolean} ECS HTTP, User-Agent तथा ​​URL क्षेत्रेषु req तथा res HTTP अनुरोधं प्रतिक्रियाक्षेत्रं च लॉग् कर्तव्यं वा।पूर्वनिर्धारितं मूल्यम्:असत्य।
    • apmIntegration {type-boolean} APM एजेण्ट् एकीकरणं सक्षमं कर्तव्यं वा।पूर्वनिर्धारितं मूल्यम्:सत्यम्‌।
    • serviceName {type-string} "सेवा.नाम" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceVersion {type-string} "सेवा.संस्करण" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceEnvironment {type-string} "सेवा.पर्यावरण" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय APM एजेण्टतः किमपि मूल्यं अधिलिखति ।
    • serviceNodeName {type-string} "सेवा.नोड.नाम" मूल्यम्। यदि निर्दिष्टं भवति तर्हि सक्रिय एपीएम एजेण्टतः यत्किमपि मूल्यं अधिलिखितं भविष्यति ।
    • eventDataset {type-string} "घटना.दत्तांशसमूह" मूल्यम्। यदि निर्दिष्टं भवति तर्हि ${serviceVersion} इत्यस्य उपयोगस्य पूर्वनिर्धारितं सेटिङ्ग् अधिलिखितं भविष्यति ।

winston कृते एकं स्वरूपकं रचयन्तु यत् logging information object इत्यत्र क्षेत्राणि ECS logging format इत्यत्र परिवर्तयति ।

ecsStringify ([विकल्प]) 1.1.

JSON मध्ये log records stringify/serialize कर्तुं winston कृते formatter रचयन्तु ।

इदं logform.json() इत्यस्य सदृशम् अस्ति । तौ JSON उत्पन्नं कर्तुं safe-stable-stringify संकुलस्य उपयोगं कुर्वतः । केचन भेदाः : १.

  • अयं स्ट्रिंग्फायरः स्तरक्षेत्रस्य क्रमाङ्कनं त्यजति यतः एतत् ECS क्षेत्रं नास्ति ।
  • विन्स्टन् एकं bigin replacer प्रदाति यत् string मध्ये परिवर्तयति । अस्य कारणं यत् JavaScript JSON पार्सरः bigints इत्यस्य विश्लेषणं कुर्वन् सटीकताम् नष्टं करोति । आक्षेपः अस्ति यत् BigInt इत्यनेन प्रकारं संख्यायाः स्थाने स्ट्रिंग् इति परिवर्तते । सम्प्रति, एषः स्ट्रिंग्फायरः BitInt इत्येतत् स्ट्रिंग् इत्यत्र न परिवर्तयति ।