TypeScript एप्लिकेशन लॉगिंग का परिचय
\n\nलॉगिंग प्रोग्राम के चलने के दौरान होने वाली घटनाओं को रिकॉर्ड करने की प्रक्रिया है। TypeScript एप्लिकेशन, खासकर Node.js वातावरण में चलने वाले, के लिए सही लॉगिंग सिर्फ एक अच्छी आदत नहीं, बल्कि डिबगिंग, मॉनिटरिंग और एरर विश्लेषण के लिए एक महत्वपूर्ण उपकरण है।
\n\nकई शुरुआती डेवलपर केवल console.log() का उपयोग करते हैं। लेकिन production वातावरण में यह तरीका अप्रभावी है: यह महत्व के स्तरों को प्रबंधित करने, संदेशों को फ़िल्टर करने या फ़ाइलों में सहेजने की सुविधा नहीं देता। इस लेख में, हम सीखेंगे कि TypeScript में एक पेशेवर लॉगिंग सिस्टम कैसे बनाया जाए।
Production में console.log का उपयोग क्यों न करें?
\n\nएक सामान्य उदाहरण देखें:
\n\n// खराब तरीका - सीधे console.log का उपयोग\nfunction processOrder(orderId: string): void {\n console.log(`Processing order ${orderId}`);\n try {\n // बिज़नेस लॉजिक\n } catch (error) {\n console.error(`Error processing order: ${error}`);\n }\n}\n\n\nइस तरीके की समस्याएं:
\n- \n
- लॉगिंग स्तरों का अभाव: debug संदेशों को गंभीर त्रुटियों से अलग नहीं किया जा सकता। \n
- कोई फ़ॉर्मेटिंग नहीं: बड़े डेटा को पढ़ना मुश्किल होता है। \n
- रीडायरेक्ट नहीं किया जा सकता: सभी संदेश केवल stdout/stderr पर जाते हैं। \n
- प्रदर्शन समस्याएं: कंसोल में सिंक्रोनस राइटिंग एप्लिकेशन को धीमा कर सकती है। \n
TypeScript में लॉगिंग के सर्वोत्तम अभ्यास
\n\n1. लॉगिंग लाइब्रेरी का चयन
\n\nTypeScript के लिए दो लोकप्रिय लाइब्रेरीज़ में से एक का उपयोग करने की सलाह दी जाती है:
\n- \n
- Winston — ट्रांसपोर्ट (फ़ाइल, कंसोल, डेटाबेस) के साथ एक शक्तिशाली और लचीला लॉगर। \n
- Pino — एक अत्यंत तेज़ लॉगर, जो high-load एप्लिकेशन के लिए आदर्श है। \n
Winston इंस्टॉल करें:
\nnpm install winston\nnpm install @types/winston --save-dev\n\n\n2. कॉन्फ़िगरेबल लॉगर बनाना
\n\nएक logger.ts मॉड्यूल बनाएं:
import winston from 'winston';\n\nconst logger = winston.createLogger({\n level: process.env.LOG_LEVEL || 'info',\n format: winston.format.combine(\n winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n winston.format.errors({ stack: true }),\n winston.format.json()\n ),\n transports: [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.simple()\n )\n }),\n new winston.transports.File({ \n filename: 'logs/error.log', \n level: 'error' \n }),\n new winston.transports.File({ \n filename: 'logs/combined.log' \n })\n ]\n});\n\nexport default logger;\n\n\nअब किसी भी मॉड्यूल में लॉगर का उपयोग करें:
\nimport logger from './logger';\n\nfunction getUser(id: string) {\n logger.info(`Fetching user with ID: ${id}`);\n try {\n // उपयोगकर्ता प्राप्त करने का लॉजिक\n logger.debug('User data retrieved successfully');\n } catch (error) {\n logger.error('Failed to fetch user', { userId: id, error });\n }\n}\n\n\n3. लॉगिंग स्तरों का उपयोग
\n\nमानक स्तर (कम से अधिक महत्वपूर्ण):
\n- \n
- debug — विस्तृत डिबग जानकारी (केवल विकास के लिए)। \n
- info — सामान्य सूचनात्मक संदेश। \n
- warn — संभावित समस्याओं के बारे में चेतावनी। \n
- error — त्रुटियां जिन पर ध्यान देने की आवश्यकता है। \n
एनवायरनमेंट वेरिएबल के माध्यम से लॉगिंग स्तर सेट करें:
\n// .env फ़ाइल में\nLOG_LEVEL=debug # विकास के लिए\nLOG_LEVEL=warn # production के लिए\n\n\n4. संरचित लॉगिंग
\n\nअतिरिक्त जानकारी पास करें