C# अनुप्रयोगों में लॉगिंग: सर्वोत्तम अभ्यास और उपकरण (.NET)
लॉगिंग केवल फ़ाइल में संदेश लिखना नहीं है। यह C# पर किसी भी production-एप्लिकेशन का सबसे महत्वपूर्ण घटक है। गुणवत्तापूर्ण लॉगिंग सिस्टम के बिना आप आँख बंद करके काम कर रहे हैं: त्रुटियाँ किसी का ध्यान नहीं जातीं, प्रदर्शन का विश्लेषण करना कठिन है, और डिबगिंग अनुमान लगाने जैसी हो जाती है। इस लेख में, हम .NET इकोसिस्टम में लॉगिंग के सर्वोत्तम अभ्यासों पर चर्चा करेंगे, लोकप्रिय लाइब्रेरीज़ (Serilog, NLog), सही लॉगिंग स्तर और डेटा संग्रह के लिए संरचित दृष्टिकोण देखेंगे।
1. लॉगिंग लाइब्रेरी का चयन: Serilog बनाम NLog
.NET की दुनिया में कई परिपक्व समाधान हैं। दो सबसे लोकप्रिय हैं Serilog और NLog। दोनों एसिंक्रोनस लॉगिंग, कई sinks (आउटपुट लक्ष्य) और ILogger के माध्यम से .NET Core/5+ के साथ एकीकरण का समर्थन करते हैं।
Serilog
Serilog अपने संरचित लॉगिंग दर्शन के लिए जाना जाता है। सरल स्ट्रिंग के बजाय, आप ऑब्जेक्ट पास करते हैं, और Serilog उन्हें JSON में serialize करता है। यह Elasticsearch, Seq या Datadog जैसी प्रणालियों के लिए आदर्श है।
// Serilog उदाहरणusing Serilog;
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day) .CreateLogger();
Log.Information("उपयोगकर्ता {UserId} ने {Time} पर लॉगिन किया", userId, DateTime.UtcNow);NLog
NLog अधिक पारंपरिक है, लेकिन कम शक्तिशाली नहीं है। यह उन परियोजनाओं के लिए उपयुक्त है जहाँ XML या कोड के माध्यम से लचीले कॉन्फ़िगरेशन की आवश्यकता होती है। यह फ़ाइल रोटेशन, ईमेल भेजना और डेटाबेस के साथ एकीकरण का समर्थन करता है।
// NLog उदाहरणusing NLog;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
Logger.Info("उपयोगकर्ता {UserId} ने कार्रवाई की", userId);कब क्या चुनें? यदि आप माइक्रोसर्विसेज़ बना रहे हैं या ELK-स्टैक का उपयोग कर रहे हैं - Serilog लें। यदि आपको legacy-प्रोजेक्ट्स में सरल सेटअप चाहिए - NLog। किसी भी स्थिति में, दोनों Microsoft.Extensions.Logging से मानक ILogger का समर्थन करते हैं।
2. लॉगिंग स्तर: कब और क्या लिखें
सबसे आम गलतियों में से एक है सब कुछ Information स्तर पर लिखना या, इसके विपरीत, हर जगह Debug लगाना। सही स्तरों का उपयोग करें:
- Trace (0) — अत्यधिक विस्तृत जानकारी: विधियों में प्रवेश/निकास, चर के मान। केवल डिबगिंग के दौरान उपयोग करें।
- Debug (1) — डिबग संदेश, डेवलपर के लिए उपयोगी, लेकिन ऑपरेटर के लिए नहीं।
- Information (2) — व्यावसायिक घटनाएँ: "ऑर्डर बनाया गया", "उपयोगकर्ता पंजीकृत हुआ"। यह मुख्य कार्य स्तर है।
- Warning (3) — असामान्य स्थिति जो एप्लिकेशन को नहीं तोड़ती: अनुरोध टाइमआउट, कनेक्शन का पुनः प्रयास।
- Error (4) — हैंडल किए गए अपवाद, व्यावसायिक तर्क त्रुटियाँ, मॉड्यूल विफलताएँ।
- Critical (5) — घातक त्रुटियाँ: DB से कनेक्शन खोना, मेमोरी की कमी, पूरे एप्लिकेशन का क्रैश होना।
// स्तरों के सही उपयोग का उदाहरणpublic async Task<Order> CreateOrderAsync(CreateOrderRequest request){ Log.Debug("उपयोगकर्ता {UserId} के लिए ऑर्डर निर्माण शुरू", request.UserId);
try { var order = new Order(request); await _repository.SaveAsync(order); Log.Information("ऑर्डर {OrderId} उपयोगकर्ता {UserId} द्वारा बनाया गया", order.Id, request.UserId); return order; } catch (DbException ex) { Log.Error(ex, "उपयोगकर्ता {UserId} के लिए ऑर्डर बनाते समय DB त्रुटि", request.UserId); throw; // ऊपर भेजें }}3. संरचित लॉगिंग: यह क्यों महत्वपूर्ण है?
पारंपरिक लॉगिंग स्ट्रिंग के माध्यम से