जावास्क्रिप्ट अनुप्रयोगों में लॉगिंग: शुरुआती लोगों के लिए सर्वोत्तम अभ्यास
लॉगिंग किसी भी एप्लिकेशन के डिबगिंग और मॉनिटरिंग का आधार है। गुणवत्तापूर्ण लॉग के बिना, जब कुछ गलत होता है तो आप 'सुई के ढेर में सुई' ढूंढ रहे होंगे। इस लेख में, हम जावास्क्रिप्ट (Node.js) में लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे, जो छोटे प्रोजेक्ट और प्रोडक्शन दोनों के लिए उपयुक्त हैं।
1. console.log पर निर्भर क्यों नहीं रहना चाहिए?
कई नौसिखिए डेवलपर हर चीज़ के लिए console.log का उपयोग करते हैं। यह डेवलपमेंट चरण में सुविधाजनक है, लेकिन प्रोडक्शन वातावरण में यह दृष्टिकोण समस्याएँ पैदा करता है:
- कोई लॉगिंग स्तर नहीं — आप त्रुटियों को सूचनात्मक संदेशों से फ़िल्टर नहीं कर सकते।
- आउटपुट प्रबंधित करना कठिन — आप विशिष्ट मॉड्यूल के लिए लॉग बंद नहीं कर सकते।
- खराब प्रदर्शन —
console.logमें ऑब्जेक्ट का सीरियलाइज़ेशन महंगा हो सकता है। - संरचना का अभाव — लॉग में एक समान प्रारूप (JSON, समय, स्तर) नहीं होता है।
इसके बजाय, विशेष लाइब्रेरीज़ का उपयोग करें। यहाँ Winston का उपयोग करते हुए एक सरल लेकिन सही उदाहरण है:
// logger.jsconst 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' }), ],});
if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple(), }));}
module.exports = logger;2. लॉगिंग स्तर: कब क्या उपयोग करें
मानक लॉगिंग स्तर (गंभीरता के बढ़ते क्रम में): debug, info, warn, error। यह समझना महत्वपूर्ण है कि कौन सा स्तर कब लागू करना है:
- debug — डेवलपर्स के लिए विस्तृत जानकारी (चर के मान, सिस्टम स्थिति)। प्रोडक्शन में बंद कर दिया जाता है।
- info — एप्लिकेशन संचालन की सामान्य घटनाएँ (अनुरोध संसाधित, उपयोगकर्ता पंजीकृत)।
- warn — संभावित रूप से खतरनाक स्थितियाँ (कम मेमोरी, पुराना API)।
- error — त्रुटियाँ जिनमें हस्तक्षेप की आवश्यकता है (अपवाद, DB विफलताएँ)।
Pino लाइब्रेरी (Node.js के लिए सबसे तेज़) के साथ सही उपयोग का उदाहरण:
const pino = require('pino');
const logger = pino({ level: process.env.LOG_LEVEL || 'info', transport: { target: 'pino-pretty', options: { colorize: true } }});
// उपयोगlogger.info({ userId: 123 }, 'उपयोगकर्ता सिस्टम में लॉग इन हुआ');logger.error(new Error('DB से कनेक्शन में त्रुटि'), 'गंभीर त्रुटि');logger.debug('चर x का मान = 42'); // यदि level = 'info' है तो प्रदर्शित नहीं होगा3. संरचित लॉगिंग: JSON और संदर्भ
टेक्स्ट स्ट्रिंग के बजाय संरचित लॉग (आमतौर पर JSON) का उपयोग करें। यह अनुमति देता है:
- टूल (ELK, Graylog) के साथ लॉग को आसानी से पार्स करना।
- संदर्भ जोड़ना (अनुरोध ID, उपयोगकर्ता, संस्करण)।
- डेटा को फ़िल्टर और एकत्र करना।
संदर्भ के साथ संरचित लॉग का उदाहरण:
const logger = require('./logger');
app.use((req, res, next) => { req.requestId = uuidv4(); next();});
app.get('/api/users', async (req, res) => { logger.info({ requestId: req.requestId, method: req.method, url: req.originalUrl, ip: req.ip }, 'आने वाला अनुरोध');
try { const users = await getUsers(); logger.info({ requestId: req.requestId, count: users.length }, 'उपयोगकर्ता प्राप्त हुए'); res.json(users); } catch (err) { logger.error({