TypeScript अनुप्रयोगों में लॉगिंग: व्यावहारिक सर्वोत्तम अभ्यास

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

TypeScript अनुप्रयोगों में लॉगिंग: व्यावहारिक सर्वोत्तम अभ्यास

\n\n

लॉगिंग किसी भी production-अनुप्रयोग का एक मूलभूत हिस्सा है। यह न केवल कोड के निष्पादन को ट्रैक करने और त्रुटियों का पता लगाने की अनुमति देता है, बल्कि सुरक्षा ऑडिट करने, प्रदर्शन का विश्लेषण करने और जटिल परिदृश्यों को डीबग करने में भी मदद करता है। TypeScript में, अपनी शक्तिशाली टाइप प्रणाली के साथ, लॉगिंग का दृष्टिकोण और भी अधिक लचीला और विश्वसनीय हो जाता है। इस लेख में, हम विशिष्ट उदाहरणों के साथ लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे।

\n\n

1. लाइब्रेरी का चयन और लॉगर का कॉन्फ़िगरेशन

\n\n

सबसे पहले, एक उपयुक्त लाइब्रेरी चुनना है। लोकप्रिय समाधानों में winston और pino शामिल हैं। दोनों TypeScript को मूल रूप से समर्थन करते हैं, लेकिन उनकी अलग-अलग प्राथमिकताएँ हैं: winston — लचीलापन और समृद्ध कार्यक्षमता, pino — अधिकतम प्रदर्शन।

\n\n

टाइपिफिकेशन के साथ winston के कॉन्फ़िगरेशन का एक उदाहरण देखें:

\n\n
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  defaultMeta: { service: 'user-service' },\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({ filename: 'logs/error.log', level: 'error' }),\n    new winston.transports.File({ filename: 'logs/combined.log' }),\n  ],\n});\n\nexport default logger;\n
\n\n

pino के लिए, कॉन्फ़िगरेशन अधिक संक्षिप्त होगा, लेकिन कम प्रभावी नहीं:

\n\n
import pino from 'pino';\n\nconst logger = pino({\n  level: process.env.LOG_LEVEL || 'info',\n  transport: {\n    target: 'pino-pretty',\n    options: {\n      colorize: true,\n      translateTime: 'SYS:standard',\n    },\n  },\n});\n\nexport default logger;\n
\n\n

सुझाव: लॉगिंग स्तर के कॉन्फ़िगरेशन को हमेशा पर्यावरण चर (LOG_LEVEL) में रखें। उत्पादन में आमतौर पर info या warn का उपयोग किया जाता है, और विकास में debug का।

\n\n

2. संरचित लॉगिंग और संदर्भ

\n\n

मुख्य गलतियों में से एक सरल स्ट्रिंग्स को लॉग करना है। इसके बजाय, संरचित ऑब्जेक्ट्स का उपयोग करें। वे ELK, Grafana या Datadog जैसी प्रणालियों में लॉग को आसानी से फ़िल्टर और एकत्र करने की अनुमति देते हैं।

\n\n

खराब लॉगिंग का उदाहरण:

\n\n
logger.info('User logged in successfully');\n
\n\n

संदर्भ के साथ अच्छी लॉगिंग का उदाहरण:

\n\n
logger.info({\n  message: 'User logged in',\n  userId: user.id,\n  email: user.email,\n  loginMethod: 'oauth',\n  ip: request.ip,\n  duration: Date.now() - startTime,\n});\n
\n\n

सुविधा के लिए, एक टाइपिफाइड रैपर बनाया जा सकता है:

\n\n
interface LogContext {\n  requestId?: string;\n  userId?: string;\n  action?: string;\n  [key: string]: unknown;\n}\n\nfunction logWithContext(message: string, context: LogContext = {}): void {\n  logger.info({ message, ...context });\n}\n\n// उपयोग\nlogWithContext('Order processed', { \n  orderId: '12345', \n  userId: 'user_678', \n  total: 99.99 \n});\n
\n\n

यह दृष्टिकोण सुनिश्चित करता है कि प्रत्येक लॉग में विश्लेषण के लिए महत्वपूर्ण जानकारी हो।

\n\n

3. त्रुटियों और अपवादों की लॉगिंग

\n\n

त्रुटि प्रबंधन लॉगिंग का सबसे महत्वपूर्ण हिस्सा है। हमेशा त्रुटि का पूरा स्टैक और वह संदर्भ लॉग करें जिसमें यह हुई। console.error का उपयोग न करें — यह रोटेशन और फ़ॉर्मेटिंग के लिए लचीलापन प्रदान नहीं करता है।

\n\n

TypeScript के साथ सही पैटर्न:

\n\n
import logger from './logger';\n\nasync function fetchUserData(userId: string): Promise<UserData> {\n  try {\n    const response = await api.get(`/users/${userId}`);\n    ret                

ब्लॉग

पुस्तक अनुशंसाएँ