স্বাগতম! আজকে আমরা শিখতে যাচ্ছি Logging-এর দুনিয়ার অন্যতম সেরা এবং প্রোডাকশন-রেডি একটি টপিক—Serilog Database Sink (MS SQL Server)।
আপনার Outline অনুযায়ী, আমরা এখন Section 20: Logging-এর দশম লেকচার “275. Serilog Database Sink”-এ আছি। এর আগে আমরা Console এবং File-এ লগ সেভ করা শিখেছি। কিন্তু রিয়েল-ওয়ার্ল্ড বা এন্টারপ্রাইজ লেভেল অ্যাপ্লিকেশনে লগগুলো সাধারণত Database-এ সেভ করা হয়, যাতে পরবর্তীতে খুব সহজেই Query করে নির্দিষ্ট Error বা Information খুঁজে বের করা যায়।
চলুন শুরু করা যাক আজকের অসাধারণ টপিকটি!
📝 Short Summary for Quick Revision
- The Goal: Serilog ব্যবহার করে ASP.NET Core অ্যাপ্লিকেশনের লগগুলো সরাসরি MS SQL Server ডেটাবেসে সেভ করা।
- NuGet Package: এর জন্য
Serilog.Sinks.MSSqlServerপ্যাকেজটি ইনস্টল করতে হবে। - Configuration:
appsettings.jsonফাইলেরUsingএবংWriteToসেকশনে MS SQL Server-এর কনফিগারেশন (Connection String, Table Name) যুক্ত করতে হবে। - Database Setup: ডেটাবেসটি (যেমন:
CRUDLogs) ম্যানুয়ালি তৈরি করতে হবে, তবে ভেতরের Table (যেমন:Logs) Serilog নিজেই স্বয়ংক্রিয়ভাবে তৈরি করে নেবে। - Structured Logging: এটি সাধারণ স্ট্রিংয়ের বদলে
MessageTemplateব্যবহার করে লগ সেভ করে, যা অনেকটা C#-এরstring.Format-এর মতো কাজ করে। - Multiple Sinks: আপনি চাইলে একই সাথে Console, File এবং Database Sink চালু রাখতে পারেন। কোনোটি বন্ধ করতে চাইলে শুধু
WriteToথেকে রিমুভ বা কমেন্ট করে দিলেই হবে।
🧠 Comprehensive Breakdown
এখানে আমরা লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে আলোচনা করব এবং সাথে Code Implementation দেখব।
১. Database Sink কেন প্রয়োজন? (Priority: 9/10)
ফাইলে লগ সেভ করা ভালো, কিন্তু যখন লাখ লাখ লগ তৈরি হয়, তখন টেক্সট ফাইল থেকে নির্দিষ্ট একটি Error বা ইউজারের লগ খুঁজে বের করা খুব কঠিন। Database-এ লগ সেভ করলে আপনি খুব সহজেই SQL Query চালিয়ে (যেমন: SELECT * FROM Logs WHERE Level = 'Error') কাঙ্ক্ষিত লগটি খুঁজে পেতে পারেন। Serilog শুধুমাত্র MS SQL Server নয়, বরং PostgreSQL, MySQL, Cosmos DB-এর মতো ডেটাবেসও সাপোর্ট করে।
২. NuGet Package Installation (Priority: 10/10)
MS SQL Server-এ লগ সেভ করার জন্য আমাদের নতুন একটি প্যাকেজ লাগবে।
Visual Studio-এর NuGet Package Manager থেকে Serilog.Sinks.MSSqlServer ইনস্টল করুন।
(VS Code ব্যবহারকারীদের জন্য Command:)
dotnet add package Serilog.Sinks.MSSqlServer
৩. appsettings.json Configuration (Priority: 10/10)
প্যাকেজ ইনস্টল করার পর, আমাদের appsettings.json ফাইলে Serilog কনফিগারেশন আপডেট করতে হবে।
Code Implementation:
{
"Serilog": {
"MinimumLevel": "Information",
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.File",
"Serilog.Sinks.MSSqlServer"
],
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "Server=(localdb)\\mssqllocaldb;Database=CRUDLogs;Trusted_Connection=True;MultipleActiveResultSets=true",
"tableName": "Logs",
"autoCreateSqlTable": true
}
}
]
},
"AllowedHosts": "*"
}
Why behind the Arguments (Args):
connectionString: আপনার ডেটাবেসের কানেকশন স্ট্রিং। ট্রেইনার এখানেCRUDLogsনামের একটি নতুন ডেটাবেস ব্যবহার করেছেন, যা শুধু লগের জন্য।tableName: ডেটাবেসে যে টেবিলে লগ সেভ হবে (যেমন:Logs)। আপনি চাইলে যেকোনো নাম দিতে পারেন।autoCreateSqlTable: এটিtrueকরে দিলে, আপনাকে ম্যানুয়ালি টেবিল বানাতে হবে না। অ্যাপ্লিকেশন রান হওয়ার সময় Serilog চেক করবে ডেটাবেসে টেবিলটি আছে কি না, না থাকলে সে নিজেই এটি তৈরি করে নেবে।
৪. Database তৈরি করা এবং Run করা (Priority: 8/10)
Serilog টেবিল বানাতে পারলেও, ডেটাবেসটি আপনাকেই বানাতে হবে।
- Visual Studio:
View->SQL Server Object Explorerথেকে(localdb)\mssqllocaldb-এ গিয়েCRUDLogsনামে নতুন একটি ডেটাবেস তৈরি করুন। - Visual Studio Code: আপনি যদি VS Code ব্যবহার করেন, তবে SQL Server (mssql) এক্সটেনশনটি ব্যবহার করে LocalDB বা আপনার SQL Server-এ কানেক্ট করে একটি নিউ কোয়েরি রান করুন:
CREATE DATABASE CRUDLogs;
এরপর অ্যাপ্লিকেশনটি রান করুন। আপনার অ্যাপ্লিকেশন আগের মতোই চলবে, কিন্তু ব্যাকগ্রাউন্ডে Serilog ডেটাবেসে ডেটা রাইট করবে।
৫. Table Structure এবং Structured Logging (Priority: 10/10)
অ্যাপ্লিকেশন বন্ধ করে আপনি যখন ডেটাবেসের Logs টেবিলের View Data বা SELECT * FROM Logs কোয়েরি চালাবেন, তখন নিচের কলামগুলো দেখতে পাবেন:
- Id: স্বয়ংক্রিয়ভাবে জেনারেট হওয়া সিরিয়াল নম্বর।
- Message: আসল লগ মেসেজ (যা আমরা Console-এ দেখি)।
- MessageTemplate: এটি Structured Logging-এর মূল বিষয়।
- কেন এটি দরকার? ধরুন আপনার লগটি হলো:
Index action method of PersonsController. এখানেPersonsControllerএবংIndexডায়নামিক হতে পারে। Structured Logging-এ এটি সেভ হয় টেমপ্লেট আকারে, যেমন:{ActionName} action method of {ControllerName}। এটি C#-এরstring.Format-এর মতো কাজ করে। রানটাইমে ভ্যালুগুলো এই টেমপ্লেটে বসে Message তৈরি করে।
- Level: লগের লেভেল (Information, Warning, Error ইত্যাদি)।
- TimeStamp: লগটি কখন তৈরি হয়েছে তার ডেট এবং টাইম।
- Exception: যদি কোনো Exception হয়, তার পুরো স্ট্যাক ট্রেস (Stack Trace) এখানে সেভ হয়।
প্রতিবার অ্যাপ্লিকেশন রান করলে নতুন লগগুলো এই একই টেবিলে Appended (যুক্ত) হতে থাকবে।
৬. Multiple Sinks পরিচালনা করা (Priority: 7/10)
বর্তমানে আমাদের Console, File এবং Database—তিনটি Sink একসাথেই কাজ করছে। যদি কখনো আপনার মনে হয় যে, “আমি আর File Sink চাই না”, তাহলে শুধু appsettings.json-এর WriteTo অ্যারে থেকে File-এর ব্লকটি ডিলিট বা কমেন্ট করে দিলেই হবে। কোডে কোনো পরিবর্তন করার প্রয়োজন নেই!
🚀 Best Practices & .NET Modern Updates
Best Practices for Database Logging:
- Don’t Log Everything: ডেটাবেসে কখনোই
DebugবাTraceলেভেলের লগ সেভ করবেন না। এটি খুব দ্রুত ডেটাবেসের স্টোরেজ ফুল করে দেবে এবং ডেটাবেস স্লো হয়ে যাবে। Database Sink-এর জন্য সবসময়MinimumLevelWarningবাErrorরাখা উচিত। - Separate Database: লগের জন্য সবসময় মেইন অ্যাপ্লিকেশনের ডেটাবেস থেকে আলাদা একটি ডেটাবেস ব্যবহার করবেন (যেমনটা ট্রেইনার
CRUDLogsতৈরি করে দেখিয়েছেন)। এতে মেইন ডেটাবেসের পারফরম্যান্সে প্রভাব পড়ে না।
Modern .NET 10 Updates (Async and Batching):
.NET 10-এ হাই-পারফরম্যান্স এন্টারপ্রাইজ অ্যাপ্লিকেশনে ডেটাবেস লগিংয়ের জন্য সিঙ্ক্রোনাস (Synchronous) অপারেশনের বদলে Batching ব্যবহার করা হয়। ট্র্যাডিশনাল Serilog.Sinks.MSSqlServer ব্যাচিং সাপোর্ট করে, যা প্রতিটা রিকোয়েস্টের জন্য বারবার ডেটাবেস হিট না করে, একসাথে অনেকগুলো লগ জমিয়ে তারপর ইনসার্ট করে।
.NET 10 Programmatic Configuration Setup: যদিও JSON কনফিগারেশন এখনও বেস্ট, তবে কোডের মাধ্যমে ব্যাচিং সেটআপ করলে পারফরম্যান্স অনেক বেটার হয়:
using Serilog;
using Serilog.Sinks.MSSqlServer;
var builder = WebApplication.CreateBuilder(args);
// .NET 10 Programmatic Setup with High-Performance Batching
builder.Host.UseSerilog((context, services, loggerConfiguration) =>
{
var connectionString = context.Configuration.GetConnectionString("LogConnection");
loggerConfiguration
.MinimumLevel.Warning() // ডেটাবেসে শুধু Warning এবং Error সেভ হবে
.WriteTo.MSSqlServer(
connectionString: connectionString,
sinkOptions: new MSSqlServerSinkOptions
{
TableName = "Logs",
AutoCreateSqlTable = true,
BatchPostingLimit = 50, // ৫০টি লগ একসাথে হলে তবেই DB তে রাইট হবে (Performance boost)
BatchPeriod = TimeSpan.FromSeconds(5) // অথবা প্রতি ৫ সেকেন্ড পরপর রাইট হবে
});
});
এই ব্যাচিং অ্যাপ্রোচটি (Batch Posting) সার্ভার এবং ডেটাবেসের ওপর অনেক চাপ কমিয়ে দেয়।
দারুণ! আপনি এখন Serilog ব্যবহার করে Console, File এবং Database—সব জায়গাতেই লগ হ্যান্ডেল করতে পারেন। সামনের লেকচারগুলোতে আরও ইন্টারেস্টিং কিছু আসতে চলেছে!