স্বাগতম! আজকে আমরা HTTP Logging-এর সবচেয়ে ইন্টারেস্টিং পার্ট শিখব—HTTP Logging Options

আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর সপ্তম লেকচার “272. HTTP Logging Options”-এ আছি। আগের লেকচারে আমরা দেখেছি যে, ডিফল্টভাবে HTTP Logging রিকোয়েস্ট ও রেসপন্সের অনেক কিছু লগ করে, কিন্তু বডি (Body) লগ করে না। আজকের লেকচারে আমরা শিখব কীভাবে আপনি নিজের প্রয়োজন অনুযায়ী ঠিক করে দিতে পারেন যে আপনি লগে ঠিক কী কী দেখতে চান এবং কী কী বাদ দিতে চান।

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

📝 Short Summary for Quick Revision

  • HTTP Logging Fields: এটি একটি Enumeration (HttpLoggingFields), যার মাধ্যমে ঠিক করা যায় লগে কী কী রেকর্ড হবে।

  • Available Options:

  • RequestMethod, RequestPath, RequestProtocol, RequestScheme, RequestQuery

  • RequestHeaders, ResponseHeaders

  • RequestBody, ResponseBody (পারফরম্যান্সের কারণে এটি ব্যবহার করা নিরুৎসাহিত করা হয়)

  • RequestPropertiesAndHeaders, ResponsePropertiesAndHeaders (ডিফল্ট)

  • All (সবকিছু লগ করবে)

  • How to Configure: Program.cs ফাইলে builder.Services.AddHttpLogging(options => ...) ব্যবহার করে কনফিগার করতে হয়।

  • Bitwise OR (|): একাধিক অপশন একসাথে ব্যবহার করার জন্য Pipe (|) বা Bitwise OR অপারেটর ব্যবহার করা হয়।


🧠 Comprehensive Breakdown

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

১. HttpLoggingFields Enumeration (Priority: 10/10)

HTTP Logging-এর ক্ষেত্রে আপনি কোন লেভেলের ডিটেইলস চান, তা বোঝানোর জন্য ASP.NET Core-এ HttpLoggingFields নামে একটি enum রয়েছে। এর মাধ্যমে আপনি খুব সূক্ষ্মভাবে (Granular control) লগ ফিল্টার করতে পারেন।

কিছু গুরুত্বপূর্ণ Fields:

  • RequestPropertiesAndHeaders (Default): রিকোয়েস্টের Protocol, Method (GET/POST), Scheme (http/https), Path এবং সমস্ত Headers (যেমন: Accept, User-Agent) লগ করে।
  • RequestProperties: Headers ছাড়া শুধু বেসিক প্রোপার্টিগুলো লগ করে।
  • RequestBody / ResponseBody: ফর্ম ডেটা বা JSON পে-লোড লগ করে। (তবে আগের লেকচারের মতো আবারও বলা হয়েছে, এটি সার্ভার পারফরম্যান্সে বিশাল নেতিবাচক প্রভাব ফেলে, তাই এটি ব্যবহার করা রেকমেন্ডেড নয়)।
  • All: রিকোয়েস্ট এবং রেসপন্সের সবকিছু (Body সহ) লগ করবে। এটি ভুলেও প্রোডাকশনে ব্যবহার করা উচিত নয়।

২. কীভাবে Options Configure করবেন? (Priority: 10/10)

app.UseHttpLogging() কল করার আগে (অর্থাৎ builder.Build()-এর আগে) Service Collection-এ AddHttpLogging যুক্ত করে অপশনগুলো সেট করতে হয়।

Code Implementation:

var builder = WebApplication.CreateBuilder(args);
 
// HTTP Logging Options কনফিগার করা
builder.Services.AddHttpLogging(options =>
{
    // আমরা ঠিক করে দিচ্ছি যে আমরা শুধু Request Properties এবং Response Properties+Headers চাই
    options.LoggingFields = HttpLoggingFields.RequestProperties | 
                            HttpLoggingFields.ResponsePropertiesAndHeaders;
});
 
var app = builder.Build();
 
// মিডলওয়্যার যুক্ত করা (অবশ্যই রাখতে হবে)
app.UseHttpLogging();
 
app.MapGet("/", () => "Hello World!");
 
app.Run();
 

Why use the Pipe (|) symbol? যেহেতু HttpLoggingFields একটি [Flags] enum, তাই একাধিক অপশন একসাথে যুক্ত করতে Bitwise OR বা Pipe (|) অপারেটর ব্যবহার করা হয়। উপরের কোডে এর অর্থ হলো: “আমাকে Request-এর প্রোপার্টিগুলো দেখাও, কিন্তু Request-এর হেডারগুলো দেখানোর দরকার নেই। আর Response-এর ক্ষেত্রে প্রোপার্টি এবং হেডার দুটোই দেখাও।“

৩. Kestrel Console-এ আউটপুট চেক করা (Priority: 8/10)

উপরের কোড রান করার পর Kestrel কনসোল খুললে আপনি পার্থক্য বুঝতে পারবেন:

Request Log (আগের চেয়ে ছোট):

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: GET
      Scheme: http
      PathBase:
      Path: /persons/index
 

(খেয়াল করুন, এখানে কোনো Request Header যেমন- User-Agent বা Accept দেখা যাচ্ছে না, কারণ আমরা RequestProperties দিয়েছি, RequestPropertiesAndHeaders নয়।)

Response Log:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: text/html; charset=utf-8
 

৪. HTTP Logging-এর আসল ব্যবহার (Priority: 7/10)

লেকচারের শেষে ট্রেইনার বলেছেন যে, এটি একটি ছোট ফিচার হলেও প্রোডাকশনে অত্যন্ত কাজে দেয়। কোন ব্রাউজার থেকে রিকোয়েস্ট আসছে, কোন API এন্ডপয়েন্টে হিট পড়ছে এবং রেসপন্স ঠিকমতো যাচ্ছে কি না—এই সমস্ত ডেটা ভবিষ্যতে ইনভেস্টিগেশন বা অডিট করার জন্য এটি দারুণ সাহায্য করে।


🚀 Best Practices & .NET Modern Updates

Best Practices for HTTP Logging Options:

  • Filter Sensitive Headers: যদি আপনি Headers লগ করেন, তবে Authorization বা Cookie-এর মতো সেনসিটিভ হেডারগুলো বাদ দেওয়া উচিত।
  • Custom Configuration: AddHttpLogging এর ভেতরে আপনি চাইলে নির্দিষ্ট হেডার লগ করার পারমিশন দিতে পারেন:
builder.Services.AddHttpLogging(options =>
{
    options.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders;
    options.RequestHeaders.Add("X-My-Custom-Header"); // শুধুমাত্র এই হেডারগুলো লগ হবে
    options.ResponseHeaders.Add("My-Response-Header");
});
 

Modern .NET Updates (.NET 10 - Combine Logging Fields): .NET 8 এবং 10-এ HttpLoggingFields.All ব্যবহার করার বদলে নতুন এবং সিকিউর কিছু ফ্ল্যাগ আনা হয়েছে। .NET 10-এ আপনি CombineLogs অপশন ব্যবহার করে রিকোয়েস্ট এবং রেসপন্স লগটিকে দুটি আলাদা লগের বদলে একটি সিগেল (Single) লগে কম্বাইন করতে পারেন।

.NET 10 Code Implementation (Combined Logs for Performance):

var builder = WebApplication.CreateBuilder(args);
 
builder.Services.AddHttpLogging(options =>
{
    options.LoggingFields = HttpLoggingFields.RequestProperties | HttpLoggingFields.ResponsePropertiesAndHeaders;
    options.CombineLogs = true; // .NET 8+ Feature: Request এবং Response-কে একটি মেসেজ হিসেবে লগ করবে, পারফরম্যান্স অনেক ভালো হবে।
});
 
var app = builder.Build();
app.UseHttpLogging();
 

এই CombineLogs ফিচারটি কনসোলকে অনেক বেশি ক্লিন রাখে এবং সার্ভারের I/O অপারেশন কমায়।

আশা করি HTTP Logging Options-এর কনসেপ্টটি আপনার কাছে একদম ক্লিয়ার! এরপর আপনারা ইন্ডাস্ট্রির অন্যতম জনপ্রিয় থার্ড-পার্টি লগিং লাইব্রেরি “Serilog” নিয়ে কাজ শুরু করবেন।