স্বাগতম! আজকে আমরা ইন্ডাস্ট্রিতে সবচেয়ে বেশি ব্যবহৃত এবং অত্যন্ত পাওয়ারফুল একটি টপিক নিয়ে আলোচনা করব—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 ইন্টিগ্রেট করার জন্য প্রথমে দুটি প্যাকেজ ইনস্টল করতে হবে:
Serilog(মূল লাইব্রেরি)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-এMinimumLevelWarningবা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-এর আসল ম্যাজিক!