স্বাগতম! আজকে আমরা Logging-এর একটি অত্যন্ত পাওয়ারফুল ফিচার নিয়ে আলোচনা করব—HTTP Logging

আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর ষষ্ঠ লেকচার “271. HTTP Logging”-এ আছি। এর আগের লেকচারগুলোতে আমরা Controller, Service এবং Repository-তে ম্যানুয়ালি লগ লেখা শিখেছি। কিন্তু চিন্তা করে দেখুন, যদি এমন কোনো ব্যবস্থা থাকত যা স্বয়ংক্রিয়ভাবে ক্লায়েন্ট (ব্রাউজার) থেকে আসা রিকোয়েস্ট এবং সার্ভার থেকে পাঠানো রেসপন্সের সমস্ত ডিটেইলস লগ করে রাখে? “HTTP Logging” ঠিক এই কাজটিই করে।

চলুন শুরু করা যাক!

📝 Short Summary for Quick Revision

  • HTTP Logging কী? এটি ASP.NET Core-এর একটি বিল্ট-ইন ফিচার (Middleware), যা রিয়েল-টাইমে ইনকামিং HTTP Request এবং আউটগোয়িং HTTP Response-এর সমস্ত ডিটেইলস (যেমন: Method, Path, Headers) লগ করে রাখে।
  • How to Enable: Program.cs ফাইলে app.UseHttpLogging(); কল করে এটি রিকোয়েস্ট পাইপলাইনে যুক্ত করতে হয়।
  • Configuration: appsettings.Development.json ফাইলে Microsoft.AspNetCore এর Minimum Log Level অবশ্যই Information সেট করা থাকতে হবে।
  • What is Logged: ডিফল্টভাবে এটি Protocol, Method (GET/POST), Scheme (http/https), URL Path এবং Request/Response Headers লগ করে।
  • What is NOT Logged by default: এটি ডিফল্টভাবে Request Body এবং Response Body লগ করে না।
  • Performance Warning: সব রিকোয়েস্টের Body লগ করা মেমরি ও পারফরম্যান্সের জন্য ক্ষতিকর (Insane)। এটি শুধুমাত্র খুব প্রয়োজন হলেই চালু করা উচিত।

🧠 Comprehensive Breakdown

এখানে আমরা লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে আলোচনা করব এবং সাথে Code Implementation দেখব।

১. HTTP Logging-এর উদ্দেশ্য (Priority: 10/10)

যখন কোনো ক্লায়েন্ট (যেমন: ব্রাউজার) সার্ভারে রিকোয়েস্ট পাঠায়, তখন আমরা জানতে চাই যে ঠিক কী রিকোয়েস্ট এসেছে এবং আমরা কী রেসপন্স পাঠিয়েছি। HTTP Logging চালু থাকলে, সার্ভারে রিকোয়েস্ট আসতেই (রিয়েল-টাইমে) এটি লগে লিখে রাখে:

  • Request Details: কোন URL-এ রিকোয়েস্ট এসেছে, HTTP মেথড কী (GET/POST), এবং হেডারে কী কী ডেটা পাঠানো হয়েছে।
  • Response Details: রিকোয়েস্ট প্রসেস হওয়ার পর সার্ভার কী স্ট্যাটাস কোড (যেমন: 200 OK) এবং হেডার পাঠাচ্ছে।

এর মাধ্যমে খুব সহজেই ট্র্যাক করা যায় যে সার্ভার কতগুলো রিকোয়েস্ট রিসিভ করছে এবং কোনো নির্দিষ্ট রিকোয়েস্টে কোনো সমস্যা হচ্ছে কি না।

২. কীভাবে HTTP Logging Enable করবেন? (Priority: 10/10)

সবচেয়ে দারুণ ব্যাপার হলো, এর জন্য কোনো থার্ড-পার্টি NuGet Package ইনস্টল করতে হয় না। এটি ASP.NET Core-এর নিজস্ব ফিচার। এটি চালু করতে হলে Program.cs ফাইলে Middleware হিসেবে একে যুক্ত করতে হবে।

Code Implementation:

var builder = WebApplication.CreateBuilder(args);
// অন্যান্য সার্ভিস...
 
var app = builder.Build();
 
// HTTP Logging Middleware যুক্ত করা (এটি পাইপলাইনের উপরের দিকে রাখা ভালো)
app.UseHttpLogging();
 
// অন্যান্য মিডলওয়্যার...
app.UseRouting();
app.MapControllers();
 
app.Run();
 

৩. Configuration: Log Level সেট করা (Priority: 9/10)

যেহেতু এই লগগুলো আপনার নিজের লেখা নয়, বরং ASP.NET Core ফ্রেমওয়ার্ক নিজে থেকে জেনারেট করছে, তাই appsettings.Development.json ফাইলে Microsoft.AspNetCore ক্যাটাগরির Log Level চেক করতে হবে।

Code Implementation:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft.AspNetCore": "Information" 
    }
  }
}
 

Note: যদি Microsoft.AspNetCore এর ভ্যালু Warning সেট করা থাকে (যেমনটা আমরা আগের লেকচারগুলোতে করেছিলাম), তবে আপনি HTTP Logs দেখতে পাবেন না। কারণ HTTP Logs-এর লেভেল হলো Information

৪. Kestrel Console-এ Logs দেখা (Priority: 8/10)

উপরের কনফিগারেশন করার পর অ্যাপ্লিকেশন রান করে Kestrel কনসোল খুললে আপনি পুরো রিকোয়েস্ট সাইকেল দেখতে পাবেন:

A. Request Log:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: GET
      Scheme: http
      PathBase:
      Path: /persons/index
      Accept: text/html,application/xhtml+xml...
      Host: localhost:5001
      User-Agent: Mozilla/5.0...
 

এরপর আপনার Controller, Service এবং Repository-এর ম্যানুয়াল লগগুলো (যা আমরা আগের লেকচারে লিখেছি) প্রিন্ট হবে।

B. Response Log:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: text/html; charset=utf-8
      Date: Wed, 21 Oct 2026 15:30:00 GMT
 

৫. Request এবং Response Body লগ না করার কারণ (Performance Warning) (Priority: 10/10)

আপনি খেয়াল করলে দেখবেন, উপরের লগে কোথাও Request Body (যেমন: ফর্ম সাবমিট করা ডেটা) বা Response Body (যেমন: পুরো HTML পেইজ বা JSON ডেটা) প্রিন্ট হয়নি।

Why? কারণ বডি ডেটা সাধারণত অনেক বড় হয় এবং এটি স্ট্রিম (Stream) করে সার্ভারে আসে বা ক্লায়েন্টের কাছে যায়। প্রতিটা রিকোয়েস্টের জন্য এত বড় ডেটা লগে লেখা (Write) হলে সার্ভারের মেমরি দ্রুত ফুল হয়ে যাবে এবং অ্যাপ্লিকেশনের স্পিড মারাত্মকভাবে কমে যাবে। ট্রেইনার একে “Insane” (পাগলামি) বলেছেন।

তবে, ডিবাগিংয়ের জন্য সাময়িকভাবে এটি চালু করার প্রয়োজন হতে পারে। আগামী লেকচারে আপনারা শিখবেন কীভাবে Options ব্যবহার করে নির্দিষ্টভাবে বডি বা অন্যান্য ডিটেইলস লগিং কনফিগার করতে হয়।


🚀 Best Practices & .NET Modern Updates

Best Practices for HTTP Logging:

  • Don’t use in Production blindly: প্রোডাকশনে কখনোই পুরো HTTP Logging চালু রাখবেন না। এতে প্রচুর ডিস্ক স্পেস নষ্ট হয় এবং সেনসিটিভ ডেটা (যেমন: Authorization Header) লগে সেভ হয়ে যাওয়ার ঝুঁকি থাকে।
  • Placement of Middleware: app.UseHttpLogging(); মিডলওয়্যারটি রিকোয়েস্ট পাইপলাইনে যতটা সম্ভব উপরে রাখা উচিত, যাতে অন্য কোনো মিডলওয়্যার (যেমন: Exception Handler) রিকোয়েস্ট মডিফাই করার আগেই সে আসল রিকোয়েস্ট রেকর্ড করতে পারে।

Modern .NET Updates (.NET 10 - AddHttpLogging): .NET 8 এবং .NET 10-এ HTTP Logging-কে আরও ফ্লেক্সিবল করার জন্য Service Collection-এ AddHttpLogging কল করা বাধ্যতামূলক করা হয়েছে (যা আগে ঐচ্ছিক ছিল)।

.NET 10 Code Implementation:

var builder = WebApplication.CreateBuilder(args);
 
// .NET 10: Service Collection-এ HTTP Logging যুক্ত করা (এখানেই অপশন কনফিগার করা যায়)
builder.Services.AddHttpLogging(options =>
{
    // পরবর্তী লেকচারে আপনারা এই অপশনগুলো বিস্তারিত শিখবেন
});
 
var app = builder.Build();
 
// মিডলওয়্যার যুক্ত করা
app.UseHttpLogging();
 
app.MapGet("/", () => "Hello World!");
 
app.Run();
 

এই নতুন অ্যাপ্রোচটি পারফরম্যান্সের দিক থেকে অনেক বেশি অপ্টিমাইজড। সামনের লেকচারে Options কনফিগারেশনটি বেশ ইন্টারেস্টিং হবে!