স্বাগতম! আজকে আমরা Logging-এর একটি অত্যন্ত প্র্যাকটিক্যাল এবং গুরুত্বপূর্ণ বিষয় শিখতে যাচ্ছি—Logging Configuration

আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর তৃতীয় লেকচার “268. Logging Configuration”-এ আছি। আগের লেকচারে আমরা ILogger ব্যবহার করে বিভিন্ন লেভেলের লগ জেনারেট করা শিখেছি, কিন্তু দেখেছি যে Debug লগগুলো কনসোলে দেখা যাচ্ছিল না। আজকের লেকচারে আমরা শিখব কীভাবে কনফিগারেশন পরিবর্তন করে আমাদের কাঙ্ক্ষিত Log Level সেট করতে হয়। এর ঠিক পরেই আমরা “Logging Providers” নিয়ে জানব।

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

📝 Short Summary for Quick Revision

  • The Missing Logs: ডিফল্টভাবে ASP.NET Core-এর Minimum Log Level Information সেট করা থাকে, তাই Debug বা Trace লগগুলো কনসোলে শো করে না।
  • Configuration Files: Log Level কনফিগার করার জন্য appsettings.json ফাইল ব্যবহার করা হয়।
  • Environment Override: appsettings.json-এর সেটিংসকে ওভাররাইড (Override) করে appsettings.Development.json ফাইল, কারণ এটি পরে লোড হয়।
  • Default vs Framework Logs: Default সেটিংটি আমাদের লেখা (User-defined) লগের জন্য কাজ করে, আর Microsoft.AspNetCore সেটিংটি ASP.NET Core-এর বিল্ট-ইন লাইব্রেরি লগের জন্য কাজ করে।
  • Log Structure: কনসোলে প্রিন্ট হওয়া প্রতিটি লগে সাধারণত ৩টি অংশ থাকে: Log Level (যেমন: info), Class Name এবং আসল Log Message।

🧠 Comprehensive Breakdown

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

১. সমস্যা: Debug Logs কেন দেখা যাচ্ছে না? (Priority: 9/10)

আগের লেকচারে আমরা LogDebug ব্যবহার করে কোড লিখেছিলাম, কিন্তু Kestrel console-এ সেটি প্রিন্ট হয়নি। Why? এর কারণ হলো ASP.NET Core-এর ডিফল্ট Minimum Log Level হলো Information। অর্থাৎ, Information এবং এর চেয়ে ওপরের লেভেলের (Warning, Error, Critical) লগগুলোই শুধু কনসোলে প্রিন্ট হবে। Debug যেহেতু Information-এর নিচের লেভেল, তাই এটি বাই ডিফল্ট ইগনোরড হয়ে যায়।

২. Configuration Files এবং Environment (Priority: 10/10)

এই Minimum Log Level পরিবর্তন করার জন্য আমাদের Configuration ফাইল ব্যবহার করতে হবে। ASP.NET Core প্রজেক্টে সাধারণত দুটি প্রধান কনফিগারেশন ফাইল থাকে:

  1. appsettings.json (Global বা Default সেটিংস)
  2. appsettings.Development.json (Development Environment-এর জন্য স্পেসিফিক সেটিংস)

The Override Rule: আপনি যদি appsettings.json-এ Log Level পরিবর্তন করেন, কিন্তু appsettings.Development.json-এ অন্য কিছু লেখা থাকে, তবে appsettings.Development.json ফাইলটিই রেস জিতবে (wins the race)। কারণ Environment-specific ফাইলটি সবার শেষে লোড হয়। তাই Development চলাকালীন যেকোনো পরিবর্তন appsettings.Development.json-এ করাই বেস্ট প্র্যাকটিস।

৩. Default vs Microsoft.AspNetCore (Priority: 10/10)

appsettings.Development.json ফাইলটি ওপেন করলে আপনি নিচের মতো একটি Logging ব্লক দেখতে পাবেন:

Code Implementation (appsettings.Development.json):

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

ব্যাখ্যা (Why behind the keys):

  • Default: এটি হলো আপনার User-defined logs-এর জন্য। অর্থাৎ আপনি আপনার Controller বা Service-এ যে লগগুলো লিখবেন, তার Minimum Level কী হবে তা এটি ঠিক করে। লেকচার অনুযায়ী, আমরা এটি Information থেকে পরিবর্তন করে Debug করেছি, যাতে আমাদের LogDebug মেসেজগুলো দেখা যায়।
  • Microsoft.AspNetCore: ASP.NET Core-এর নিজস্ব বিল্ট-ইন লাইব্রেরিগুলোও ব্যাকগ্রাউন্ডে প্রচুর লগ জেনারেট করে। আমরা যদি এর ভ্যালুও Debug করে দিই, তবে কনসোল অপ্রয়োজনীয় লগে ভরে যাবে। তাই এটি Warning সেট করে রাখা হয়, যাতে ফ্রেমওয়ার্কের নিজস্ব কোনো Error বা Warning থাকলেই কেবল আমরা তা দেখতে পাই, অপ্রয়োজনীয় Information নয়।

এই পরিবর্তন করার পর অ্যাপ্লিকেশন রান করলে আপনি Kestrel command prompt-এ আপনার লেখা Debug মেসেজগুলোও দেখতে পাবেন।

৪. Kestrel Console-এ Log-এর স্ট্রাকচার (Priority: 6/10)

যখন লগগুলো কনসোলে প্রিন্ট হয়, তখন সেগুলোর একটি নির্দিষ্ট প্যাটার্ন থাকে:

  1. Log Level: যেমন- info, warn, fail, বা dbug
  2. Class Name: কোন ক্লাস বা কম্পোনেন্ট থেকে লগটি জেনারেট হয়েছে (যেমন: Microsoft.AspNetCore.Hosting.Diagnostics)।
  3. Log Message: লগের আসল টেক্সট বা মেসেজ।

🚀 Best Practices & .NET Modern Updates

Best Practices for Logging Configuration:

  • Production Environment-এ সতর্কতা: কখনোই Production Environment-এর appsettings.Production.json-এ Default Log Level Debug বা Trace সেট করবেন না। এতে সার্ভারের মেমরি এবং স্টোরেজ খুব দ্রুত ফুল হয়ে যাবে এবং পারফরম্যান্স খারাপ হবে। Production-এর জন্য সবসময় Warning বা Error ব্যবহার করা উচিত।
  • Namespace Specific Filtering: আপনি চাইলে আপনার প্রজেক্টের নির্দিষ্ট কোনো ফোল্ডার বা Namespace-এর জন্য আলাদা Log Level সেট করতে পারেন। যেমন:
"LogLevel": {
  "Default": "Information",
  "MyProject.Services": "Debug" 
}
 

Modern .NET Updates (.NET 10 Programmatic Configuration): লেকচারে দেখানো JSON কনফিগারেশন পদ্ধতিটি .NET 10-এও একদম পারফেক্টলি কাজ করে। তবে আধুনিক Minimal API এবং Web API প্রজেক্টে, আপনি চাইলে JSON ফাইলের ওপর নির্ভর না করে সরাসরি Program.cs ফাইলে কোডের মাধ্যমে অত্যন্ত ক্লিন ওয়েতে Logging Configuration করতে পারেন:

var builder = WebApplication.CreateBuilder(args);
 
// .NET 10 Modern Programmatic Logging Configuration
builder.Logging.ClearProviders(); // ডিফল্ট সব প্রোভাইডার ক্লিয়ার করে দেওয়া
builder.Logging.AddConsole();     // শুধু কনসোল প্রোভাইডার অ্যাড করা
 
// কোডের মাধ্যমেই Log Level সেট করা (appsettings-কে ওভাররাইড করে)
builder.Logging.SetMinimumLevel(LogLevel.Debug);
builder.Logging.AddFilter("Microsoft.AspNetCore", LogLevel.Warning);
 
var app = builder.Build();
 
app.MapGet("/", (ILogger<Program> logger) => 
{
    logger.LogDebug("This debug message is configured via C# code!");
    return "Hello World";
});
 
app.Run();
 

এই পদ্ধতিটি তখন খুব কাজে দেয় যখন আপনি JSON ফাইলের বদলে Environment Variables বা Cloud Secrets থেকে সরাসরি কোডের মাধ্যমে কনফিগারেশন কন্ট্রোল করতে চান।