بررسی قابلیت لاگ کردن اطلاعات Logging در ASP.NET Core

بررسی قابلیت لاگ کردن اطلاعات Logging در ASP.NET Core

در این پست از وبسایت پرووید، در رابطه با بررسی قابلیت لاگ کردن اطلاعات Logging در ASP.NET Core صحبت خواهیم کرد. به ادامه ی مطلب بروید.

در این قسمت از آموزش ASP.NET Core از وب سایت پرووید در رابطه با عملیات Logging و یا ثبت کردن Log Message ها صحبت خواهیم کرد. در ASP.NET Core همان مکانیزم یکسان Logging که در .NET Core مورد استفاده قرار می گیرد استفاده می شود. بنابراین حتماً توصیه می کنیم که قسمت قبلی از این آموزش را با دقت بیشتری مطالعه کنید. در این مثال ما عملیات Logging را در یک برنامه ASP.NET Core 2.x بررسی و پیاده سازی خواهیم کرد. همانطور که در قسمت قبل نیز خدمتتان عرض شد، Logging API که در 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 نصب شده است. بنابراین دیگر نیازی به نصب کردن این موارد نداریم. ضمناً توصیه می کنیم که از آموزش ویدئویی NuGet در دات نت استفاده کنید.

اضافه کردن 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.Configuration.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 براحتی قابل انجام است. در این رابطه می توانید بررسی قابلیت 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();
    }
}

حال برای اجرای کردن برنامه ابتدا Command Prompt را باز کرده و به آدرس /<app root folder>/bin/debug/netcoreapp2.1 می رویم. پس از آن با دستور dotnet <app name>.dll برنامه را باز کرده و در مرورگر به آدرس http://localhost:5000 می رویم. این موضوع باعث می شود که اطلاعات log شده نشان داده شوند.

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه تمامی دوستان عزیز قرار گرفته باشد. از شما دعوت می‌کنیم که از دیگر آموزش های ما در رابطه با فریم ورک ASP.NET Core استفاده کنید. لیست کامل این آموزش ها را می توانید در پست مربوط به آموزش کامل توسعه وب اپلیکیشن با ASP.NET Core مشاهده کنید.

مرتضی گیتی
بدون نظر

ارسال نظر

نظر
نام
ایمیل
وب سایت