परिचय: TypeScript में लॉगिंग की आवश्यकता क्यों है?
लॉगिंग केवल कंसोल में संदेश लिखना नहीं है। आधुनिक TypeScript अनुप्रयोगों (Node.js पर सर्वर-साइड, React/Angular पर क्लाइंट-साइड या full-stack प्रोजेक्ट्स) में, लॉगिंग डिबगिंग, मॉनिटरिंग और प्रदर्शन विश्लेषण के लिए एक महत्वपूर्ण उपकरण बन जाता है। गुणवत्तापूर्ण लॉगिंग के बिना, डेवलपर्स त्रुटियों को पुन: उत्पन्न करने में घंटों बिताते हैं, और DevOps इंजीनियर production में विफलता का कारण जल्दी से निर्धारित नहीं कर पाते।
TypeScript, JavaScript पर एक ओवरले के रूप में, सख्त टाइपिंग जोड़ता है, जो अधिक विश्वसनीय और पूर्वानुमानित लॉगिंग सिस्टम बनाने की अनुमति देता है। इस लेख में, हम सर्वोत्तम प्रथाओं पर चर्चा करेंगे जो आपको TypeScript प्रोजेक्ट्स में प्रभावी लॉगिंग व्यवस्थित करने में मदद करेंगी।
लॉगिंग के मूल सिद्धांत
लॉगिंग स्तर
लॉगिंग स्तरों का सही उपयोग किसी भी मॉनिटरिंग सिस्टम की नींव है। TypeScript में, निम्नलिखित स्तरों (बढ़ते महत्व के क्रम में) का उपयोग करना आम है:
debug— विस्तृत डिबग जानकारी (केवल विकास के लिए);info— मानक सूचनात्मक संदेश (सर्वर स्टार्टअप, अनुरोध);warn— चेतावनियाँ (गैर-गंभीर समस्याएं);error— त्रुटियाँ जिन पर ध्यान देने की आवश्यकता है;fatal— गंभीर त्रुटियाँ जो एप्लिकेशन को रोक देती हैं।
Winston लाइब्रेरी का उपयोग करके स्तरों को कॉन्फ़िगर करने का उदाहरण:
import winston from 'winston';
const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', format: winston.format.json(), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' }), ],});
logger.info('सर्वर पोर्ट 3000 पर शुरू हुआ');logger.warn('मेमोरी सीमा के करीब है');logger.error('DB कनेक्शन में त्रुटि');संरचित लॉग
सरल स्ट्रिंग संदेशों से बचें। संदर्भ जानकारी (JSON प्रारूप) के साथ संरचित लॉग का उपयोग करें। यह ELK या Grafana जैसी प्रणालियों में खोज और विश्लेषण को सरल बनाता है।
// खराबlogger.info(`उपयोगकर्ता ${userId} ने कार्रवाई ${action} की`);
// अच्छाlogger.info('उपयोगकर्ता कार्रवाई', { userId: userId, action: action, timestamp: new Date().toISOString(), ip: request.ip,});यह दृष्टिकोण फ़ील्ड द्वारा लॉग को फ़िल्टर करने और ग्राफ़ बनाने की अनुमति देता है।
TypeScript के लिए सर्वोत्तम अभ्यास
लॉग टाइपिंग के लिए TypeScript का उपयोग
TypeScript आपको लॉग संदर्भ के लिए इंटरफ़ेस परिभाषित करने की अनुमति देता है, जो फ़ील्ड नामों में आकस्मिक त्रुटियों को रोकता है:
interface LogContext { userId: string; action: string; durationMs: number; success: boolean;}
function logUserAction(context: LogContext): void { logger.info('User action', context);}
// कंपाइलर जाँच करेगा कि सभी फ़ील्ड सही ढंग से पास किए गए हैंlogUserAction({ userId: '123', action: 'login', durationMs: 150, success: true,});संवेदनशील डेटा लॉग करने से बचें
कभी भी पासवर्ड, टोकन, क्रेडिट कार्ड नंबर या व्यक्तिगत डेटा (GDPR) लॉग न करें। मास्किंग के लिए उपयोगिताओं का उपयोग करें:
function sanitizeLogData(data: Record<string, unknown>): Record<string, unknown> { const sensitiveFields = ['password', 'token', 'ssn']; const sanitized = { ...data }; for (const field of sensitiveFields) { if (sanitized[field]) { sanitized[field] = '***'; } } return sanitized;}
logger.info('उपयोगकर्ता पंजीकरण', sanitizeLogData(userData));अतुल्यकालिक लॉगिंग और प्रदर्शन
उच्च-लोड अनुप्रयोगों में, सिंक्रोनस लॉगिंग कार्य को धीमा कर सकती है। अतुल्यकालिक ट्रांसपोर्ट का उपयोग करें (उदाहरण के लिए, winston बफरिंग का समर्थन करता है)।