परिचय: TypeScript में लॉगिंग क्यों महत्वपूर्ण है
लॉगिंग केवल फ़ाइल में घटनाओं को रिकॉर्ड करना नहीं है। आधुनिक TypeScript अनुप्रयोगों में, उचित रूप से कॉन्फ़िगर की गई लॉगिंग डिबगिंग, निगरानी और प्रदर्शन विश्लेषण का आधार है। गुणवत्तापूर्ण लॉग के बिना, डेवलपर त्रुटियों को पुन: उत्पन्न करने में घंटों बिताता है, और संचालन टीम जल्दी से बाधाओं की पहचान नहीं कर पाती है।
TypeScript, JavaScript के ऊपर एक परत के रूप में, सख्त टाइपिंग प्रदान करता है, जो अधिक पूर्वानुमानित और सुरक्षित लॉगिंग सिस्टम बनाने की अनुमति देता है। हालाँकि, प्रोडक्शन में सरल console.log() का उपयोग एक एंटी-पैटर्न है जो सूचना शोर और महत्वपूर्ण डेटा के नुकसान की ओर ले जाता है।
इस लेख में, हम TypeScript में लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे: लाइब्रेरी चुनने से लेकर लॉग को संरचित करने और संदर्भ के साथ काम करने तक।
लॉगिंग के लिए लाइब्रेरी चुनना
TypeScript/Node.js इकोसिस्टम में कई लोकप्रिय लाइब्रेरीज़ हैं। आइए तीन मुख्य विकल्पों पर विचार करें:
- Winston — ट्रांसपोर्ट (कंसोल, फ़ाइल, डेटाबेस में आउटपुट) के लचीले कॉन्फ़िगरेशन के साथ सबसे लोकप्रिय लाइब्रेरी। यह लॉगिंग स्तरों और फ़ॉर्मेटिंग का समर्थन करता है।
- Pino — प्रदर्शन-उन्मुख आधुनिक लाइब्रेरी। उच्च-लोड सिस्टम के लिए आदर्श।
- Bunyan — कम लोकप्रिय लेकिन स्थिर विकल्प। सभी लॉगर JSON प्रारूप में डेटा आउटपुट करते हैं।
TypeScript पर एक विशिष्ट अनुप्रयोग के लिए, हम Winston या Pino की अनुशंसा करते हैं। TypeScript के साथ Winston सेटअप का उदाहरण:
import winston from 'winston';
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'error.log', level: 'error' }), ],});
logger.info('सर्वर प्रारंभ हुआ', { port: 3000 });TypeScript के साथ एकीकरण: प्रकार और इंटरफ़ेस
टाइपिंग का अधिकतम लाभ उठाने के लिए, इंटरफ़ेस का उपयोग करके लॉगर के लिए एक रैपर बनाएँ:
interface LoggerOptions { level?: string; service?: string;}
interface ILogger { info(message: string, meta?: unknown): void; error(message: string, error?: Error): void; warn(message: string, meta?: unknown): void;}यह आपको पास किए गए डेटा के प्रकारों को सख्ती से नियंत्रित करने और संकलन चरण में त्रुटियों से बचने की अनुमति देगा।
लॉगिंग स्तर और उनका सही उपयोग
मानक लॉगिंग स्तर (सबसे महत्वपूर्ण से कम से कम महत्वपूर्ण तक): error, warn, info, debug, trace। एक समान शब्दार्थ का पालन करना महत्वपूर्ण है:
- error — केवल उन अपरिवर्तनीय त्रुटियों के लिए जिन पर डेवलपर का ध्यान आवश्यक है।
- warn — संभावित रूप से समस्याग्रस्त स्थितियों के लिए जो एप्लिकेशन के काम को बाधित नहीं करती हैं।
- info — मुख्य घटनाओं के लिए: सर्वर प्रारंभ, अनुरोध प्रसंस्करण, सफल प्रमाणीकरण।
- debug — विकास प्रक्रिया के दौरान डिबगिंग के लिए। इस स्तर को प्रोडक्शन में शामिल न करें।
पर्यावरण के आधार पर स्तर को गतिशील रूप से बदलने का उदाहरण:
const logLevel = process.env.NODE_ENV === 'production' ? 'warn' : 'debug';const logger = winston.createLogger({ level: logLevel });संरचित लॉग और संदर्भ
स्ट्रिंग संदेशों के बजाय, JSON प्रारूप में संरचित लॉग का उपयोग करें। यह ELK स्टैक (Elasticsearch, Logstash, Kibana) या अन्य सिस्टम के साथ लॉग को आसानी से पार्स करने की अनुमति देता है।
संदर्भ जानकारी जोड़ना सुनिश्चित करें: अनुरोध ID, उपयोगकर्ता नाम, सेवा का नाम, टाइमस्टैम्प। Pino का उपयोग करने का उदाहरण:
import pino from 'pino';
const logger = pino({ level: 'info', mixin() { return { service: 'my-api' }; },});
// में जोड़ना