স্বাগতম! আজকে আমরা ইন্ডাস্ট্রিতে সবচেয়ে বেশি ব্যবহৃত এবং অত্যন্ত পাওয়ারফুল একটি টপিক নিয়ে আলোচনা করব—Serilog Basics

আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর অষ্টম লেকচার “273. Serilog Basics”-এ আছি। এতক্ষণ আমরা ASP.NET Core-এর বিল্ট-ইন (Built-in) Logging সিস্টেম ব্যবহার করছিলাম, যার কিছু সীমাবদ্ধতা রয়েছে। সেই সীমাবদ্ধতা দূর করতেই আমরা এখন থার্ড-পার্টি ফ্রেমওয়ার্ক Serilog-এর জগতে প্রবেশ করব।

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

📝 Short Summary for Quick Revision

  • Why Serilog: ASP.NET Core-এর বিল্ট-ইন লগিং ফ্রেমওয়ার্ক দিয়ে ফাইলে বা ডেটাবেসে লগ সেভ করা যায় না। Serilog এই কাজটি খুব সহজেই করতে পারে।
  • What are Sinks: Serilog-এ Logging Destination (যেখানে লগ সেভ বা ডিসপ্লে হয়)-কে “Sink” বলা হয়। যেমন: Console Sink, File Sink, SQL Server Sink ইত্যাদি।
  • Packages Required: Serilog ব্যবহার করার জন্য প্রধানত দুটি NuGet Package লাগে: Serilog এবং Serilog.AspNetCore
  • How to Enable: Program.cs ফাইলে builder.Host.UseSerilog() কল করে বিল্ট-ইন ফ্রেমওয়ার্ককে Serilog দিয়ে রিপ্লেস করতে হয়।
  • Configuration: appsettings.json ফাইলে Serilog নামে নতুন একটি সেকশন তৈরি করে MinimumLevel, Using (Sinks-এর লিস্ট) এবং WriteTo (Sinks-এর ডিটেইলস) কনফিগার করতে হয়।

🧠 Comprehensive Breakdown

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

১. কেন আমরা Serilog ব্যবহার করব? (Priority: 10/10)

ASP.NET Core-এর নিজস্ব লগিং সিস্টেম ভালো, কিন্তু প্রোডাকশন লেভেলের জন্য এটি যথেষ্ট নয়। Drawbacks of Built-in Logger: এটি ডিফল্টভাবে লগগুলোকে কোনো এক্সটার্নাল ডেস্টিনেশনে (যেমন- Text File বা Database) স্টোর করতে পারে না। The Serilog Advantage: Serilog এই সমস্যার সমাধান দেয়। এটি ৩০-৪০ টিরও বেশি ডেস্টিনেশন বা Sinks সাপোর্ট করে। এর মাধ্যমে আপনি একই সাথে Console, Text File, SQL Server, PostgreSQL, এমনকি AWS বা Azure-এও লগ সেভ করতে পারবেন।

২. NuGet Packages Install করা (Priority: 10/10)

প্রজেক্টে Serilog ইন্টিগ্রেট করার জন্য প্রথমে দুটি প্যাকেজ ইনস্টল করতে হবে:

  1. Serilog (মূল লাইব্রেরি)
  2. Serilog.AspNetCore (ASP.NET Core-এর সাথে কানেক্ট করার জন্য)

Note: লেকচারে ২.১১ ভার্সন ব্যবহার করতে বলা হয়েছে, তবে আপনি লেটেস্ট স্টেবল ভার্সন ব্যবহার করতে পারেন, কারণ কনসেপ্ট একই।

৩. Program.cs-এ Serilog Enable করা (Priority: 10/10)

এখন আমাদের ASP.NET Core-কে বলতে হবে যে, “তোমার ডিফল্ট লগিং সিস্টেম বাদ দাও, এখন থেকে আমি Serilog ব্যবহার করব।”

Code Implementation (.NET 6/7/8/10 Minimal API Style):

using Serilog;
 
var builder = WebApplication.CreateBuilder(args);
 
// ডিফল্ট লগিং ক্লিয়ার করে দেওয়া (ঐচ্ছিক, তবে ভালো প্র্যাকটিস)
builder.Logging.ClearProviders();
 
// Serilog Enable করা এবং Configuration & Services সাপ্লাই দেওয়া
builder.Host.UseSerilog((context, services, loggerConfiguration) =>
{
    loggerConfiguration
        .ReadFrom.Configuration(context.Configuration) // appsettings.json থেকে কনফিগারেশন পড়বে
        .ReadFrom.Services(services);                  // Serilog-কে আমাদের DI কন্টেইনারের অ্যাক্সেস দেবে
});
 
var app = builder.Build();
// ...
app.Run();
 

৪. appsettings.json-এ Serilog Configuration (Priority: 10/10)

যেহেতু আমরা ReadFrom.Configuration লিখেছি, তাই এখন আমাদের appsettings.json ফাইলে Serilog-এর সেটিংস বলে দিতে হবে। আগের Logging সেকশনটি আর কাজে লাগবে না (চাইলে মুছে ফেলতে পারেন)।

Code Implementation:

{
  "Serilog": {
    "MinimumLevel": "Information", 
    
    "Using": [
      "Serilog.Sinks.Console" 
    ],
    
    "WriteTo": [
      {
        "Name": "Console" 
      }
    ]
  },
  "AllowedHosts": "*"
}
 

ব্যাখ্যা:

  • MinimumLevel: কোন লেভেল থেকে লগ প্রিন্ট হবে তা ঠিক করে দেয়। Information দিলে Information, Warning, Error এবং Critical লগ হবে, কিন্তু Debug হবে না।
  • Using: আপনি কোন কোন Sink ব্যবহার করতে চান, তার প্যাকেজের নাম এখানে লিস্ট হিসেবে দিতে হয়।
  • WriteTo: এখানে প্রতিটি Sink-এর নাম এবং তার অতিরিক্ত সেটিংস (যেমন- ফাইলের নাম, ডেটাবেস কানেকশন স্ট্রিং) দেওয়া হয়। Console-এর জন্য তেমন কোনো অতিরিক্ত সেটিংস লাগে না।

৫. আউটপুট চেক করা (Priority: 8/10)

উপরের কনফিগারেশন শেষে অ্যাপ্লিকেশন রান করে Kestrel কনসোল উইন্ডো ওপেন করলে আপনি লগের ডিজাইনে একটু পার্থক্য দেখতে পাবেন। Serilog-এর লগগুলো সাধারণত একটু ভিন্ন ফরমেটে আসে (যেমন: [INF] বা [DBG] লেখা থাকে)। সবচেয়ে বড় সুবিধা হলো, Controller, Service বা Repository লেভেলে আপনি আগে যে _logger.LogInformation(...) লিখেছিলেন, সেখানে আপনার কোনো কোড পরিবর্তন করতে হবে না! ASP.NET Core-এর ILogger এখন ব্যাকগ্রাউন্ডে স্বয়ংক্রিয়ভাবে Serilog-কে দিয়ে কাজ করাবে।


🚀 Best Practices & .NET Modern Updates

Best Practices for Serilog:

  • Use Two-Stage Initialization: লেকচারে দেখানো পদ্ধতিটি কাজ করে, কিন্তু অ্যাপলিকেশন স্টার্টআপের সময় যদি কোনো Exception হয়, তবে সেটি লগে সেভ হয় না। এজন্য Serilog “Two-Stage Initialization” সাপোর্ট করে (যা .NET 10-এও অত্যন্ত রেকমেন্ডেড)।
  • Separation of Environment: প্রোডাকশনের জন্য সবসময় appsettings.Production.json-এ MinimumLevel Warning বা Error করে রাখবেন।

Modern .NET Updates (.NET 10 - Two-Stage Initialization Example): .NET 8 বা 10-এ প্রোডাকশন গ্রেড অ্যাপ্লিকেশনের জন্য Serilog ইনিশিয়ালাইজেশন একটু অন্যভাবে করা হয়, যাতে অ্যাপ্লিকেশন ক্র্যাশ করলেও লগ পাওয়া যায়:

using Serilog;
 
// 1. শুরুতে একটি প্রাথমিক Logger তৈরি করা
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateBootstrapLogger();
 
try
{
    Log.Information("Starting web application");
    var builder = WebApplication.CreateBuilder(args);
 
    // 2. মেইন Logger সেটআপ করা
    builder.Host.UseSerilog((context, services, loggerConfiguration) => loggerConfiguration
        .ReadFrom.Configuration(context.Configuration)
        .ReadFrom.Services(services)
        .Enrich.FromLogContext()); // এটি লগে আরও কনটেক্সট অ্যাড করে
 
    var app = builder.Build();
    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
    // 3. সব লগ ফ্লাশ করে মেমরি ক্লিয়ার করা
    Log.CloseAndFlush();
}
 

এটি অত্যন্ত সেইফ এবং ইন্ডাস্ট্রিতে এভাবেই কোড লেখা হয়।

সামনের লেকচারে আপনারা “File Sink” এবং “Database Sink” দেখবেন, যা Serilog-এর আসল ম্যাজিক!