Middleware لاگینگ درخواست (داخلی) 🌐
using Microsoft.AspNetCore.HttpLogging;
builder.Services.AddHttpLogging(o =>
{
o.LoggingFields = HttpLoggingFields.RequestMethod
| HttpLoggingFields.RequestPath
| HttpLoggingFields.ResponseStatusCode
| HttpLoggingFields.Duration;
});
var app = builder.Build();
app.UseHttpLogging();
این متد، مسیر، وضعیت و مدت زمان را ثبت میکند. از لاگ کردن bodyها خودداری کنید مگر اینکه دلیل محکمی داشته باشید.
مسیرهای پرترافیک: LoggerMessage.Define ⚡️
با پیشکامپایل کردن قالبهای پیام، از تخصیص حافظه برای فرمتدهی رشته جلوگیری کنید. سورس جنریتور کد لاگینگ بهینهای ایجاد میکند.
static class Logs
{
private static readonly Action<ILogger, string, Exception?> _cacheMiss =
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(1001, "CacheMiss"),
"Cache miss for key {Key}");
public static void CacheMiss(this ILogger log, string key) => _cacheMiss(log, key, null);
}
// استفاده
log.CacheMiss(key);
لاگهای فایلی (اختیاری، با Serilog) 📂
ارائهدهندگان داخلی در فایل نمینویسند. اگر میخواهید فایلهای چرخشی (rolling files) به صورت محلی داشته باشید، Serilog را اضافه کنید:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.File
در برنامه:
using Serilog;
var logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog(logger);
✅️چه چیزی را لاگ کنیم (و چه چیزی را نه)❌️
👍 لاگ کنید: رویدادهای شروع/پایان، فراخوانیهای خارجی (هدف + مدت زمان)، رویدادهای بیزینسی، هشدارها با زمینه، خطاهای مدیریت شده با stack traces.
👎 لاگ نکنید: اسرار (secrets)، body کامل درخواست/پاسخ با اطلاعات شخصی، حلقههای پرحرف، اسپم heartbeat.
اشتباهات رایج 🤦♂️
استفاده از درونیابی رشته در پیامهای لاگ. از قالبها با placeholderهای نامدار استفاده کنید.
• لاگ کردن استثناها بدون پاس دادن خود آبجکت exception.
• نداشتن ارتباط (correlation) بین لاگهای یک درخواست.
• تبدیل همه چیز به Information یا Debug و هرگز کوتاه نکردن آن.
• نوشتن تصادفی اسرار در لاگها (توکنها، پسوردها).
🔖 هشتگها:
#CSharp #DotNet #ASPNETCore #Logging #StructuredLogging #Observability #Serilog #Debugging