JavaScript अनुप्रयोगों में लॉगिंग: सर्वोत्तम अभ्यास
लॉगिंग केवल फ़ाइल में घटनाओं को रिकॉर्ड करना नहीं है। आधुनिक Node.js अनुप्रयोगों में, यह निगरानी, डिबगिंग और ऑडिट का एक शक्तिशाली उपकरण है। गुणवत्तापूर्ण लॉगिंग के बिना, प्रोडक्शन सर्वर के क्रैश होने का कारण ढूंढना अनुमान लगाने का खेल बन जाता है। इस लेख में, हम JavaScript (Node.js) में लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे जो आपको विश्वसनीय और रखरखाव योग्य सिस्टम बनाने में मदद करेंगे।
मानक console.log एक खराब अभ्यास क्यों है
कई नौसिखिए डेवलपर डिबगिंग के लिए console.log का उपयोग करते हैं। हालांकि, प्रोडक्शन में यह समस्याएं पैदा करता है:
- स्तरों का अभाव: आप सूचनात्मक संदेशों और गंभीर त्रुटियों को अलग नहीं कर सकते।
- कोई संरचना नहीं: कंसोल आउटपुट सिर्फ एक स्ट्रिंग है जिसे पार्स करना मुश्किल है।
- ब्लॉकिंग इनपुट-आउटपुट: सिंक्रोनस राइटिंग एप्लिकेशन को धीमा कर सकती है।
- रोटेशन का अभाव: लॉग फ़ाइलें अनिश्चित काल तक बढ़ती रहेंगी।
इसके बजाय, winston या pino जैसी विशेष लाइब्रेरी का उपयोग करें। वे ट्रांसपोर्ट (फ़ाइल, कंसोल, बाहरी सेवाओं में आउटपुट) और एसिंक्रोनस राइटिंग के लिए लचीला कॉन्फ़िगरेशन प्रदान करते हैं।
लॉगिंग लाइब्रेरी का चयन: winston बनाम pino
Node.js बाजार में दो स्पष्ट नेता हैं। आइए उनकी विशेषताओं पर नजर डालें:
Winston
सबसे लोकप्रिय लाइब्रेरी। यह कई ट्रांसपोर्ट (फ़ाइल, HTTP, MongoDB, Elasticsearch) और कस्टम फॉर्मेट को सपोर्ट करती है। मोनोलिथिक अनुप्रयोगों के लिए उपयुक्त है।
const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), new winston.transports.Console({ format: winston.format.simple() }) ]});
logger.info('सर्वर पोर्ट 3000 पर शुरू हुआ');logger.error('DB कनेक्शन त्रुटि', { db: 'mongo', code: 500 });Pino
अत्यधिक तेज़ लाइब्रेरी, जो winston से 5-10 गुना तेज़ है। हाई-लोड सिस्टम और माइक्रोसर्विसेज के लिए आदर्श। डिफ़ॉल्ट रूप से JSON आउटपुट करता है।
const pino = require('pino');
const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino/file', options: { destination: './app.log' } }});
logger.info({ user: 'admin' }, 'उपयोगकर्ता सिस्टम में लॉग इन हुआ');logger.error(new Error('Timeout'), 'अनुरोध त्रुटि');सुझाव: अधिकांश प्रोजेक्ट्स के लिए इसकी लचीलापन के कारण winston चुनें। यदि प्रदर्शन महत्वपूर्ण है, तो pino का उपयोग करें।
लॉगिंग स्तर: संदेशों में कैसे न डूबें
स्तरों का सही उपयोग अच्छी लॉगिंग की नींव है। Node.js में निम्नलिखित पदानुक्रम अपनाया जाता है (सबसे कम से सबसे महत्वपूर्ण तक):
- trace / silly — अत्यधिक विस्तृत डिबग जानकारी (आमतौर पर प्रोडक्शन में बंद)।
- debug — डेवलपर्स के लिए डिबग संदेश।
- info — सामान्य संचालन की पुष्टि (अनुरोध, सेवा प्रारंभ)।
- warn — असामान्य स्थिति, लेकिन एप्लिकेशन काम करता रहता है (जैसे, अनुरोध सीमा पार करना)।
- error — ध्यान देने योग्य त्रुटि (अनुरोध विफलता, बाहरी सेवा विफलता)।
- fatal — गंभीर त्रुटि, जिसके बाद एप्लिकेशन काम जारी नहीं रख सकता।
पर्यावरण चर के माध्यम से लॉगिंग स्तर कॉन्फ़िगर करें:
const LOG_LEVEL = process.env.LOG_LEVEL || 'info';const logger = winston.createLogger({ level: LOG_LEVEL });डेवलपमेंट में debug सेट करें, प्रोडक्शन में info सेट करें।