जावास्क्रिप्ट अनुप्रयोगों में लॉगिंग: व्यवहार में सर्वोत्तम अभ्यास
\n\nलॉगिंग केवल कंसोल में संदेश लिखना नहीं है। प्रोडक्शन वातावरण में, सही ढंग से कॉन्फ़िगर की गई लॉगिंग निगरानी, डिबगिंग और ऑडिट का मुख्य उपकरण बन जाती है। इसके बिना आप आँख बंद करके काम कर रहे हैं। इस लेख में, हम Node.js पर जावास्क्रिप्ट अनुप्रयोगों के लिए लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे, लाइब्रेरी चुनने से लेकर फ़ाइल रोटेशन सेट करने तक। सभी कोड उदाहरण उपयोग के लिए तैयार हैं।
\n\n1. console.log खराब क्यों है?
\n\nडेवलपमेंट चरण में, हम सभी console.log का उपयोग करते हैं। यह तेज़ और सुविधाजनक है। लेकिन प्रोडक्शन में, यह दृष्टिकोण खतरनाक है:
- \n
- कोई लॉगिंग स्तर नहीं हैं। आप त्रुटियों को सूचनात्मक संदेशों से फ़िल्टर नहीं कर सकते। \n
- सिंक्रोनस ब्लॉकिंग। मानक
console.logउच्च अनुरोध प्रवाह पर एप्लिकेशन को धीमा कर सकता है। \n - संरचना का अभाव। अतिरिक्त हैक्स के बिना JSON लॉग को पार्स नहीं किया जा सकता। \n
- कोई रोटेशन नहीं। लॉग फ़ाइल अनिश्चित काल तक बढ़ती रहेगी जब तक कि यह डिस्क को भर न दे। \n
इसके बजाय, पेशेवर लाइब्रेरी का उपयोग करें। Node.js में दो सबसे लोकप्रिय Winston और Pino हैं।
\n\n2. लाइब्रेरी चुनना: Winston बनाम Pino
\n\nदोनों लाइब्रेरी एक ही कार्य को हल करती हैं, लेकिन उनकी अलग-अलग प्राथमिकताएँ हैं।
\n\nWinston — बहुमुखी और लचीला
\nWinston लॉगिंग का "स्विस आर्मी नाइफ" है। यह कई ट्रांसपोर्ट (फ़ाइलें, कंसोल, HTTP, डेटाबेस) का समर्थन करता है और आसानी से कॉन्फ़िगर किया जा सकता है।
\n\nconst winston = require('winston');\n\nconst logger = winston.createLogger({\n level: 'info',\n format: winston.format.json(),\n transports: [\n new winston.transports.File({ filename: 'error.log', level: 'error' }),\n new winston.transports.File({ filename: 'combined.log' }),\n ],\n});\n\n// डेवलपमेंट में कंसोल आउटपुट जोड़ें\nif (process.env.NODE_ENV !== 'production') {\n logger.add(new winston.transports.Console({\n format: winston.format.simple(),\n }));\n}\n\nlogger.info('सर्वर पोर्ट 3000 पर शुरू हुआ');\nlogger.error('DB कनेक्शन त्रुटि', { db: 'postgres' });\n\nPino — गति सर्वोपरि
\nPino को Node.js के लिए सबसे तेज़ लॉगर के रूप में स्थान दिया गया है। यह sonic-boom (एसिंक्रोनस राइटिंग) के उपयोग के कारण Winston से 5-6x तेज़ है। उच्च-लोड परियोजनाओं के लिए आदर्श।
const pino = require('pino');\n\nconst logger = pino({\n level: process.env.LOG_LEVEL || 'info',\n transport: {\n target: 'pino/file',\n options: { destination: './app.log' },\n },\n});\n\nlogger.info({ user: 'admin' }, 'उपयोगकर्ता सिस्टम में लॉग इन हुआ');\nlogger.error({ err: new Error('Timeout') }, 'अनुरोध सीमा पार कर गया');\n\nसुझाव: उच्च लोड वाले माइक्रोसर्विसेज और API के लिए Pino चुनें। कई ट्रांसपोर्ट वाले जटिल कॉन्फ़िगरेशन के लिए Winston चुनें।
\n\n3. लॉगिंग स्तर: सब कुछ info में न लिखें
\n\nमहत्व के अनुसार मानक स्तर पैमाने का उपयोग करें (बढ़ते क्रम में):
\n\n- \n
trace/debug— केवल डेवलपमेंट के लिए। विस्तृत डिबगिंग। \n info— सामान्य एप्लिकेशन संचालन: स्टार्टअप, सफल अनुरोध, व्यावसायिक घटनाएँ। \n warn— संभावित समस्याएँ: धीमे अनुरोध, मेमोरी की कमी, पुराने तरीके। \n error— अपवाद, विफलताएँ, क्रैश। हमेशा एक अलग फ़ाइल या निगरानी प्रणाली में होना चाहिए। \n fatal— गंभीर त्रुटियाँ जिनके बाद एप्लिकेशन काम करना जारी नहीं रख सकता। \n
कोड को पुनरारंभ किए बिना फ़िल्टरिंग स्तर बदलने के लिए पर्यावरण चर LOG_LEVEL सेट करें:
// Winston के साथ उदाहरण\nconst logger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n // ...\n});\n\n// में