आपका C# एप्लिकेशन चिल्ला रहा है, और आप सुन नहीं रहे?
\nकल्पना करें: आप आधी रात को C# में एक माइक्रोसर्विस का नया वर्जन लॉन्च करते हैं। सब कुछ बिल्कुल सही काम करता है... पहले 10 मिनट। और फिर — बैम! — उपयोगकर्ता धीमेपन की शिकायत करते हैं, और आप 2 GB के लॉग-फ़ाइल के सामने बैठे हैं और घास के ढेर में सुई ढूंढने की कोशिश कर रहे हैं। परिचित लगता है? यदि नहीं — तो आप या तो प्रतिभाशाली हैं, या आपने कभी वास्तव में निगरानी नहीं की है।
\nइस लेख में, हम जानेंगे कि लॉग की अराजकता को एक सुव्यवस्थित प्रणाली में कैसे बदला जाए। आप सीखेंगे कि C# लॉगिंग कैसे सेट अप करें ताकि डिप्लॉय के दौरान पागल न हों, और एप्लिकेशन मॉनिटरिंग कैसे बनाएं जो वास्तव में मदद करती है, न कि सिर्फ सुंदर ग्राफ बनाती है।
\n\nकहां से शुरू करें: सही लॉगिंग का दर्शन
\nकई डेवलपर्स सोचते हैं: "मैं Console.WriteLine लगा दूंगा — और ठीक है।" स्पॉइलर: नहीं, ठीक नहीं है। C# में वास्तविक लॉगिंग structured logging (संरचित लॉगिंग) है। इस तरह की स्ट्रिंग के बजाय:
\nLog.Info("User " + userId + " bought item " + itemId);\nआप लिखते हैं:
\nLog.Information("User {UserId} bought item {ItemId}", userId, itemId);\nअंतर बहुत बड़ा है। दूसरे मामले में, आप UserId के आधार पर लॉग फ़िल्टर कर सकते हैं, डैशबोर्ड बना सकते हैं और समस्याओं को जल्दी ढूंढ सकते हैं। यह प्रोडक्शन में C# त्रुटि निदान का आधार है।
लाइब्रेरी चुनना: Serilog बनाम NLog बनाम log4net
\n.NET बाजार में तीन मुख्य खिलाड़ी हैं। आइए उनकी तुलना उन मानदंडों के आधार पर करें जो एक वास्तविक प्रोजेक्ट के लिए महत्वपूर्ण हैं:
\n- \n
- Serilog — आधुनिक .NET का पसंदीदा। structured logging के लिए आदर्श, आसानी से कॉन्फ़िगर होता है, sinks (फ़ाइल, डेटाबेस, Elasticsearch में आउटपुट) को सपोर्ट करता है। नए प्रोजेक्ट्स के लिए अनुशंसित। \n
- NLog — XML/JSON के माध्यम से लचीले कॉन्फ़िगरेशन वाला एक अनुभवी। लीगेसी सिस्टम के लिए उपयुक्त जहां पहले से उपयोग में है। \n
- log4net — पुराना, जिसे बिना अत्यधिक आवश्यकता के न छूना बेहतर है। सपोर्ट कमज़ोर है, structured logging — सहारे से। \n
आधुनिक अनुप्रयोगों में .NET ट्रेसिंग के लिए Serilog पहली पसंद है। आइए इसे 5 मिनट में सेट अप करें।
\n\nC# में Serilog सेट अप करना: चरण-दर-चरण गाइड
\nNuGet के माध्यम से पैकेज इंस्टॉल करें:
\ndotnet add package Serilog\ndotnet add package Serilog.Sinks.Console\ndotnet add package Serilog.Sinks.File\ndotnet add package Serilog.Sinks.Seq\nअब — ASP.NET Core के लिए Program.cs में न्यूनतम कॉन्फ़िगरेशन:
using Serilog;\n\nLog.Logger = new LoggerConfiguration()\n .MinimumLevel.Information()\n .WriteTo.Console()\n .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)\n .WriteTo.Seq("http://localhost:5341") // उन्नत निगरानी के लिए\n .CreateLogger();\n\ntry\n{\n Log.Information("Starting web application");\n var builder = WebApplication.CreateBuilder(args);\n builder.Host.UseSerilog(); // होस्ट के साथ एकीकरण\n // ... बाकी कॉन्फ़िगरेशन\n var app = builder.Build();\n app.Run();\n}\ncatch (Exception ex)\n{\n Log.Fatal(ex, "Application terminated unexpectedly");\n}\nfinally\n{\n Log.CloseAndFlush();\n}\nrollingInterval पर ध्यान दें — लॉग हर दिन रोटेट होंगे, अनंत तक नहीं बढ़ेंगे। यह प्रोडक्शन में एसिंक्रोनस लॉगिंग का आधार है।
संरचित लॉग: अधिकतम लाभ कैसे प्राप्त करें
\nमान लीजिए, हमारे पास ऑर्डर प्रोसेसिंग का एक तरीका है। संरचना के बिना आप लिखेंगे:
\nlogger.LogInformation("Processing order {OrderId} for user {UserId}", order.Id, user.Id);\nSerilog के साथ यह एक JSON ऑब्जेक्ट में बदल जाता है जिसे पार्स किया जा सकता है। और यदि आप ILogger<T> के माध्यम से संदर्भ जोड़ते हैं:
public class OrderService\n{\n private readonly ILogger<OrderService> _logger;\n\n public OrderService(ILogger<OrderService> logger)\n {\n _logger = logge