স্বাগতম! আজকে আমরা Logging-এর একটি অত্যন্ত গুরুত্বপূর্ণ এবং কোর কনসেপ্ট নিয়ে আলোচনা করব—Serilog RequestId।
আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর দ্বাদশ লেকচার “277. Serilog RequestId”-এ আছি। আগের লেকচারে আমরা Seq ব্যবহার করে রিয়েল-টাইমে লগ মনিটর করা শিখেছি। কিন্তু যখন প্রোডাকশন সার্ভারে একই সাথে শত শত রিকোয়েস্ট আসে, তখন কোন লগটি কোন রিকোয়েস্টের জন্য জেনারেট হয়েছে, তা খুঁজে বের করা বেশ কঠিন হয়ে যায়। ঠিক এখানেই “RequestId”-এর ম্যাজিক শুরু!
চলুন শুরু করা যাক!
📝 Short Summary for Quick Revision
- What is RequestId: এটি একটি ইউনিক আইডেন্টিফায়ার (যেমন:
0HMJE...2), যা সার্ভারে আসা প্রতিটি নতুন রিকোয়েস্টের জন্য স্বয়ংক্রিয়ভাবে জেনারেট হয়। - The Purpose: একই রিকোয়েস্টের আন্ডারে জেনারেট হওয়া সমস্ত লগ (যেমন: Controller, Service, Database logs) ট্র্যাক করার জন্য এটি একটি কমন রেফারেন্স হিসেবে কাজ করে।
- Who generates it: এটি Serilog বা Seq তৈরি করে না; বরং ASP.NET Core নিজে থেকেই এটি জেনারেট করে (যাকে
TraceIdentifierবলা হয়)। Serilog শুধু সেই আইডিটিকেRequestIdনাম দিয়ে লগের সাথে যুক্ত করে দেয়। - Log Context: Seq ড্যাশবোর্ডে যেকোনো লগের ওপর ক্লিক করলে যে প্রোপার্টিগুলো (যেমন: Connection ID, RequestId) দেখা যায়, তাকে লগের ‘Context’ বলা হয়।
- Developer’s Role: কোড লিখে RequestId জেনারেট করার কোনো দরকার নেই। তবে ডিবাগিং বা লগ ইনভেস্টিগেশনের সময় এই আইডিটি জানা থাকা অত্যন্ত জরুরি।
🧠 Comprehensive Breakdown
এখানে আমরা লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে আলোচনা করব। এই টপিকটিতে কোডিংয়ের চেয়ে কনসেপচুয়াল নলেজ বেশি গুরুত্বপূর্ণ।
১. RequestId কী এবং এর প্রয়োজনীয়তা (Priority: 10/10)
রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশনে একই সাথে একাধিক ইউজার সার্ভারে হিট করতে পারে। ধরুন ইউজার ‘A’ এবং ইউজার ‘B’ একই সাথে রিকোয়েস্ট পাঠাল। এখন আপনার Seq বা File লগে আপনি দেখলেন:
Request started (User A)Request started (User B)Index action method reachedResponse sent (200 OK)
এখানে ৩ এবং ৪ নম্বর লগগুলো কার জন্য জেনারেট হয়েছে? User A নাকি User B? এ ধরনের কনফিউশন দূর করার জন্যই RequestId ব্যবহার করা হয়। যখনই ASP.NET Core সার্ভারে কোনো নতুন রিকোয়েস্ট ঢোকে, সার্ভার সাথে সাথেই ওই রিকোয়েস্টের জন্য একটি ইউনিক আইডি জেনারেট করে। এরপর ওই রিকোয়েস্ট থেকে যতগুলো লগ তৈরি হয়, সবগুলোর সাথেই সেই আইডিটি জুড়ে দেওয়া হয়।
২. Seq ড্যাশবোর্ডে RequestId দেখা (Priority: 9/10)
আগের লেকচার অনুযায়ী, আপনি যখন আপনার অ্যাপ্লিকেশন রান করে Seq ড্যাশবোর্ডে যাবেন, তখন অনেকগুলো লগ দেখতে পাবেন।
- যেকোনো একটি লগের ওপর ক্লিক করলে একটি প্যানেল ওপেন হবে।
- সেখানে অনেকগুলো ডেটা (Properties) দেখতে পাবেন, যেমন-
ConnectionId,ContentLength,StatusCodeইত্যাদি। এই সমস্ত ডেটার কালেকশনকে বলা হয় Log Context। - ওই Context-এর ভেতরেই আপনি
RequestIdপ্রোপার্টিটি দেখতে পাবেন (যেমন:0HMJE...2)।
৩. কীভাবে এটি ট্র্যাকিংয়ে সাহায্য করে? (Priority: 10/10)
ধরুন আপনি প্রথমে দেখলেন যে, একটি রিকোয়েস্ট স্টার্ট হয়েছে এবং তার RequestId হলো ABC।
এরপর আপনি যখন Index action method লগের ওপর ক্লিক করবেন, তখন দেখবেন সেখানেও RequestId হলো ABC।
এমনকি একদম শেষে যখন রেসপন্স পাঠানো হয় (StatusCode: 200), সেটির ওপর ক্লিক করলেও দেখবেন RequestId হলো ABC।
The Benefit: Seq ড্যাশবোর্ডে আপনি যদি ফিল্টার বক্সে শুধু একটি নির্দিষ্ট RequestId লিখে সার্চ করেন, তাহলে শুধুমাত্র ওই নির্দিষ্ট রিকোয়েস্টের সাথে জড়িত সমস্ত লগ ক্রমানুসারে আপনার সামনে চলে আসবে। এতে করে কোন রিকোয়েস্টে কোথায় Error হয়েছে, তা খুব দ্রুত এবং সহজেই ডিবাগ করা যায়।
৪. RequestId কে তৈরি করে? (Interview Question) (Priority: 9/10)
অনেক সময় ইন্টারভিউতে প্রশ্ন করা হয় যে, “Serilog-এ যে RequestId দেখা যায়, তা কি Serilog জেনারেট করে?”
Answer: না! এটি ASP.NET Core ফ্রেমওয়ার্ক নিজেই জেনারেট করে। ইন্টার্নালি একে বলা হয় TraceIdentifier (যা HttpContext.TraceIdentifier-এর মাধ্যমে অ্যাক্সেস করা যায়)। Serilog শুধুমাত্র ASP.NET Core থেকে সেই আইডিটি কালেক্ট করে এবং নিজের লগগুলোর সাথে RequestId প্রোপার্টি হিসেবে যুক্ত করে দেয়।
🚀 Best Practices & .NET Modern Updates
Best Practices for Developers:
- ট্রেইনার যেমন বলেছেন, ডেভলপার হিসেবে আপনার ম্যানুয়ালি
RequestIdনিয়ে কোড করার কিছু নেই। এটি ইনভেস্টিগেশনের জন্য। - তবে, আপনি যদি আপনার ক্লায়েন্টকে (যেমন Angular বা React অ্যাপে) রেসপন্স পাঠানোর সময় হেডারে বা Error পেজে এই
RequestIdপাঠিয়ে দেন, তাহলে ক্লায়েন্ট যখন কোনো Error-এর স্ক্রিনশট আপনাকে দেবে, আপনি সেই আইডি দিয়ে খুব সহজেই লগ খুঁজে বের করতে পারবেন।
Modern .NET Updates (Correlation ID in Microservices): RequestId সাধারণত একটি সিগেল (Single) অ্যাপ্লিকেশনের জন্য কাজ করে। কিন্তু আধুনিক .NET 10 বা মাইক্রোসার্ভিস আর্কিটেকচারে (যেখানে একটি রিকোয়েস্ট ৫-৬টি আলাদা আলাদা সার্ভিস পার হয়ে যায়) সেখানে RequestId-এর পাশাপাশি Correlation ID (W3C TraceContext) ব্যবহার করা হয়।
.NET 10 Example (How to access TraceIdentifier in Code - if needed):
[ApiController]
[Route("api/[controller]")]
public class PersonsController : ControllerBase
{
private readonly ILogger<PersonsController> _logger;
public PersonsController(ILogger<PersonsController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get()
{
// ফ্রেমওয়ার্কের জেনারেট করা আইডিটি যদি আপনার কখনো লজিকে লাগে:
var requestId = HttpContext.TraceIdentifier;
_logger.LogInformation("Processing request manually with ID: {RequestId}", requestId);
return Ok(new { TraceId = requestId, Message = "Success" });
}
}
এটি ক্লায়েন্টকে রিটার্ন করলে ক্লায়েন্ট বুঝতে পারবে তার রিকোয়েস্টের আইডি কী ছিল।
সামনের লেকচারে আপনারা “Serilog Enrichers” শিখবেন, যার মাধ্যমে RequestId-এর মতো আরও অনেক কাস্টম প্রোপার্টি লগে যুক্ত করা যায়!