که در Microsoft.Extensions.Logging قرار گرفته است می تواند با Logging Provider های Built-in و یا Third Party کار کند. بنابراین در یک اپلیکیشن ASP.NET Core MVC در ابتدا باید Microsoft.Extensions.Logging را بعنوان یک NuGet Package نصب کرده و سپس Logging Provider های مورد نظرمان را نصب کنیم. در ویژوال استودیو یک ASP.NET Core MVC Application را ایجاد کرده و مشاهده می کنیم که بصورت پیش فرض شامل NuGet Package ی با نام Microsoft.Extensions.Logging است و پس از آن Logging Provider مربوط به Microsoft.AspNetCore.App نیز بعنوان یک NuGet Package نصب شده است.
اضافه کردن Logging Provider مورد نظر

همانطور که در قسمت قبل خدمتتان عرض کردیم در ابتدا باید Provider های مورد نظرمان را در Logger Factory اضافه کنیم. در ASP.NET Core MVC Application با صدا زدن WebHost.CreateDefaultBuilder(args) می توانیم در کلاس Program.cs و Logging Provider های مختلفی را اضافه کنیم. این موضوع در کد زیر نشان داده شده است.
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}


علاوه بر این می توانیم به کد درون متد WebHost.CreateDefaultBuilder() نیز نگاهی بیاندازیم. اگر این کد را در GitHub بررسی کنید تکه کد زیر را مشاهده خواهید کرد.
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configurat ion.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
}).


بنابراین اگر بخواهیم از این Provider ها استفاده کنیم باید آنها را بصورت دستی نصب کنیم. منظور از این Provider ها Console و Debug و EventSource هستند. اگر قرار است که از Provider های دیگر استفاده کنیم در ابتدا باید تمامی Provider های از قبل موجود را حذف کرده سپس Provider مورد نظر را اضافه کنیم. برای پیکر بندی کردن Logging Provider ها از یک Extension Method با نام Configure Logging استفاده می کنیم که در اینترفیس IWebHostBuilder تعریف شده است. کد زیر نمایانگر این موضوع است.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logBuilder =>
{
logBuilder.ClearProviders(); // removes all providers from LoggerFactory
logBuilder.AddConsole();
logBuilder.AddTraceSource("Information, ActivityTracing"); // Add Trace listener provider
})
.UseStartup<Startup>();


در مثال بالا متد ConfigureLogging به عنوان پارامتر ورودی، یک Action Delegate را به شکل Action<ILogBuilder> دریافت کرده و سپس Logging Provider هایی را پیکر بندی می کند. به منظور اضافه کردن یک Logging Provider مورد نظر ابتدا تمامی Provider های پیش فرض را با استفاده از متد ClearProviders() حذف می کنیم و سپس یک Extension Method را برای اضافه کردن Logging Provider مورد نظر اضافه می کنیم. برای مثال می توانیم از متد AddTraceSource() استفاده کنیم که Trace Listener Provider را به برنامه اضافه می کند و یا حتی از متد AddConsole() استفاده کنیم که Console Logging Provider را به برنامه اضافه می کند. علاوه بر این موضوع می توانیم Logging Provider ها را با استفاده از ILoggerFactory که در متد Configure() پیکر بندی کنیم. این متد در کلاس Startup() قرار گرفته است. حال در رابطه با Log کردن اطلاعات در یک فایل Text صحبت خواهیم کرد. ذخیره کردن Log ها در یک TextFile

به منظور ذخیره کردن Log ها در یک فایل ابتدا یک NuGet Package با نام Serilog.Extensions.Logging.File را نصب می کنیم. Setrilog دارای یک Extension Method برای ILoggerFactory است و بنابراین باید وارد کلاس Startup.cs شوید و یک پارامتر از نوع ILoggeFactory را به متد Configure اضافه کنیم. پس از آن با استفاده از متد AddFile() که یک Extension Method است Serilog File Provider را شبیه به کد زیر به ASP.NET Core Dependency Injection اضافه می کنیم تا یک شیء از LoggerFactory به صورت خودکار برای ما ایجاد شود. کد زیر این موضوع را نشان می دهد. این کد باعث می شود که تمامی Log ها بصورت خودکار برای ما ایجاد شود. کد زیر این موضوع را نشان می دهد.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// other code remove for clarity
loggerFactory.AddFile("Logs/mylog-{Date}.txt");
}


این کد باعث می شود که تمامی Log ها در یک فایل با نام <mylog>-date.txt که در فولدر Log از اپلیکیشن قرار دارد ذخیره بشود. اضافه کردن Log ها در Controller

علاوه بر این می توانیم با استفاده از ILogger و یا ILoggerFactory در هرکجای برنامه ی ASP.NET Core اقدام به اضافه کردن Log کنیم. اینکار با Dependency Injection مربوط به ASP.NET Core براحتی قابل انجام است. کدی که در قسمت زیر مشاهده می کنید HomeController را نشان می دهد که عملیات Log کردن اطلاعات در آن اتفاق افتاده است.
namespace AspDotNetCoreMvcApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger _logger;

public HomeController(ILogger<HomeController> logger){
_logger = logger;
}

public IActionResult Index()
{
_logger.LogInformation("Log message in the Index() method");

return View();
}

public IActionResult About()
{
_logger.LogInformation("Log message in the About() method");

return View();
}
}
}


در مثال بالا یک پارامتر از نوع ILogger<HomeController> در درون تابع سازنده ی این Controller قرار گرفته است. فریمورک Dependency Injection مربوط به ASP.NET Core یک شی از ILogger را که به منظور Log کردن اطلاعات در متد Index() و About() مورد استفاده قرار می گیرند را وارد این Controller می کند. علاوه بر این از آنجائیکه HomeController را بعنوان پارامتر جنریک ILogger لحاظ کرده ایم نام این Controller بعنوان دسته بندی و یا Category مربوط به Log ها مورد استفاده قرار می گیرد. این موضوع در قسمت زیر نشان داده شده است. info: AspDoteNetCoreMvcApp.Controllers.HomeController[0]
Log message in the Index() method در ابتدا با استفاده از متد LogInformation() یک اطلاعات و یا Information را ثبت کرده ایم. در واقع این سطح Log را نشان می دهد. پس از آن نام کامل کلاسی که Log در آن اتفاق افتاده است لحاظ شده است که در این مثال AspDoteNetCoreMvcApp.Controllers.HomeController[0] می باشد نشان دهنده ی Event Id است. با استفاده از این Event Id می توانیم یک رکورد را برای مثال یک Id و یا یک شماره صفحه و یا اطلاعات مهم دیگر را که بطور خاص یک Log را تعریف می کنند را لحاظ کنیم. برای مثال ما هیچ Event Id خاصی لحاظ نکردیم پس بنابراین این Event Id بصورت پیش فرض صفر لحاظ شده است. در خط بعد Log Message مورد نظر با استفاده از رشته ی “Log message in the Index() method” ثبت شده است. همین کار را براحتی می توانیم با لحاظ کردن یک شی از ILoggerFactory در تابع سازنده HomeController شبیه به کد زیر انجام بدهیم.
public class HomeController : Controller
{
private readonly ILogger _logger;

public HomeController(ILoggerFactory logFactory)
{
_logger = logFactory.CreateLogger<HomeController>();
}

public IActionResult Index()
{
_logger.LogInformation("Log message in the Index() method");

return View();
}

public IActionResult About()
{
_logger.LogInformation("Log message in the About() method");

return View();
}
}


منبع: وبسایت پرووید