2013-07-17 3 views
8

मैं लॉग इन मॉड्यूल के रूप में, पल के लिए एक्सप्रेस के रूप में एक्सप्रेस का उपयोग करके, node.js में एक रीस्टफुल सर्वर विकसित कर रहा हूं, और विंस्टन। यह सर्वर एक साथ अनुरोध की एक बड़ी राशि को संभालेगा, और 'अनुरोध आईडी' जैसे कुछ का उपयोग करके प्रत्येक विशिष्ट अनुरोध के लिए लॉग प्रविष्टियों को ट्रैक करने में सक्षम होना मेरे लिए बहुत उपयोगी होगा। जब भी मैं लॉग एंट्री बनाना चाहता हूं, तो सीधे समाधान इस आईडी को लॉगिंग जानकारी के दूसरे हिस्से के रूप में जोड़ने के लिए है, लेकिन इसका मतलब सर्वर द्वारा उपयोग की जाने वाली प्रत्येक विधि को 'अनुरोध आईडी' पास करना होगा।एक्सप्रेस में मिडलवेयर श्रृंखला के माध्यम से अनुरोध (आईडी द्वारा) की पहचान कैसे करें।

मैं जानना चाहता हूं कि कोई node.js/जावास्क्रिप्ट मॉड्यूल या तकनीक है जो मुझे प्रत्येक विशिष्ट अनुरोध के लिए अनुरोध आईडी के बिना बिना किसी आसान तरीके से ऐसा करने की अनुमति देगी।

उत्तर

4

आप req ऑब्जेक्ट का उपयोग कर सकते हैं जो एक्सप्रेस में प्रत्येक अनुरोध के साथ आता है।
तो पहला मार्ग आप अपने आवेदन में क्या होगा:

var logIdIterator = 0; 

app.all('*', function(req, res, next) { 
    req.log = { 
    id: ++logIdIterator 
    } 
    return next(); 
}); 

और फिर एक्सप्रेस के भीतर कहीं भी, आप देखेंगे कि idreq में वस्तु का उपयोग कर सकते हैं: req.log.id;
आपको अभी भी कुछ ऐसे फ़ंक्शन में पास करने की आवश्यकता होगी जो कुछ लॉग बनाना चाहते हैं। वास्तव में आपके पास req.log ऑब्जेक्ट के भीतर लॉगिंग फ़ंक्शन हो सकता है, इस तरह से यह गारंटी दी जाएगी कि लॉगिंग केवल तभी होगी जब req.log ऑब्जेक्ट तक पहुंच हो।

+1

आपके उत्तर के लिए धन्यवाद। मैं आपके द्वारा प्रस्तावित समाधान का उपयोग करने के बावजूद भी। हालांकि, मुझे लागू होने के लिए आईडी को स्वचालित रूप से पहचानने का ध्यान रखा गया था। एक समाधान जिसे मैंने लागू किया था, अनुरोध ऑब्जेक्ट में आईडी को स्टोर करना था, और मेरे कस्टम लॉग फ़ंक्शन को कॉल करते समय, यह कॉलस्टैक में आईडी की तलाश करेगा। मुझे पता है कि यह कई कारणों से गलत है (अन्य कार्यों की पैरामीटर जानकारी तक पहुंच "सख्त मोड" में निषिद्ध है, कुशल नहीं है, और जब एक I/O ईवेंट निकाल दिया जाता है तो एक नया ढेर प्राप्त होता है)। मुझे लगता है कि यह संभव नहीं है और आपके द्वारा प्रस्तावित समाधान ऐसा लगता है कि यह सबसे अच्छा फिट बैठता है। –

16

यदि आप ऑटो-वृद्धि करते हैं, तो आपके बाद के लॉग एनालिटिक्स अनुरोधों को विशिष्ट रूप से पहचानने में सक्षम नहीं होंगे, क्योंकि अलग-अलग उदाहरण कॉलिंग आईडी उत्पन्न करेंगे, और ऐप को पुनरारंभ करने से स्वचालित रूप से आईडी टकराव हो जाएगा।

यहां एक और संभावित समाधान है।

स्थापित cuid:

npm install --save cuid 

फिर अपने मुख्य अनुप्रयोग फ़ाइल में:

var cuid = require('cuid'); 
var requestId = function requestId(req, res, next) { 
    req.requestId = cuid(); 
    next(); 
}; 

// Then, at the top of your middleware: 
app.use(requestId); 

अब आप एक दोस्ताना अनुरोध आईडी है कि टकराने की संभावना नहीं है मिल जाएगा, और आप कर सकेंगे अपने लॉग एनालिटिक्स और डिबगिंग के लिए अपने अनुरोधों की अनन्य पहचान करें, यहां तक ​​कि कई उदाहरणों में, और सर्वर पुनरारंभ होता है।

+1

हाँ, यह निश्चित रूप से बेहतर समाधान है, लेकिन इसके साथ समस्या यह है कि आप विंस्टन लॉग में आईडी को कैसे बेनकाब करते हैं ताकि आप अधिक डेटा डुप्लिकेशन नहीं बना सकें। –

+0

मैं डोमेन का भी उपयोग करता हूं (या जो भी वे डोमेन को प्रतिस्थापित करने का निर्णय लेते हैं) ताकि आप अपने कोड की परतों में अनुरोध जानकारी पास करके फ़ंक्शन कॉल को प्रदूषित न कर सकें। – CBP

+0

डोमेन को हटा दिया गया है, और प्रतिस्थापन के लिए कोई ठोस योजना नहीं है। –

0

आपको वैश्विक चर का उपयोग नहीं करना चाहिए।

मुझे क्या करना है प्रत्येक अनुरोध से पहले मेटा ऑब्जेक्ट को पॉप्युलेट करना है।

मैं आईडी के लिए एक UUID जनरेटर (https://github.com/kelektiv/node-uuid) का उपयोग एक अनुरोध

यहाँ एक उदाहरण

app.all('*', function(req, res, next) { 
    req.meta = { 
     ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, 
     timestamp: uuid(), 
     user_agent: req.headers['user-agent'], 
     body: req.body, 
    } 
    return next(); 
    }) 
2

मैं इस समस्या के लिए एक समाधान के लिए खोज संघर्ष कर रहा था है। जिस चीज को मैंने यहां सुझाए गए समाधानों के बारे में पसंद नहीं किया था, वह यह था कि वे परियोजना के साथ सभी कार्यों के बीच रिक ऑब्जेक्ट को साझा करने का संकेत देते हैं। मुझे आपके दृष्टिकोण को मिलाकर एक समाधान (यूआईआईडी प्रति अनुरोध बनाना) और लाइब्रेरी (निरंतरता-स्थानीय-स्टोरेज) के साथ मिला जो मॉड्यूल के बीच नामस्थान साझा करने की अनुमति देता है।

आप इस अन्य जवाब में स्पष्टीकरण प्राप्त कर सकते हैं: https://stackoverflow.com/a/47261545/5710581

आप अधिक जानकारी चाहते हैं, तो मैं नीचे इन सभी विचारों और सभी कोड एक पोस्ट में लिखा था क्रम में एक ही स्थान पर सब कुछ समझाने के लिए,: Express.js: Logging info with global unique request ID – Node.js

संबंधित मुद्दे