وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

ثبت و مشاهده ی لاگ خطاها و رویدادها در دیتابیس در برنامه های مبتنی بر ASP.NET Cre 2.1

یکی از نیازهای مهم و همیشگی در طول توسعه و نگهداری نرم افزار، مدیریت لاگ های مربوط به آن می باشد.در یک برنامه ی مبتنی بر ASP.NET Core این لاگ ها می تواند در سطوح مختلفی باشد که مقادیر یا سطوح آن در یک enum به اسم LogLevel قابل مشاهده می باشد:



 public enum LogLevel
 {
 Trace = 0,
 Debug = 1,
 Information = 2,
 Warning = 3,
 Error = 4,
 Critical = 5,
 None = 6
 }

ASP.NET Core به صورت توکار دارای یک فریم ورک Logging است که به صورت پیشفرض هم در تزریق وابستگی ها در دسترس است و کافی ست از ILoggerFactory در متد Configure از کلاس Startup برنامه استفاده کرده و یکی از پرووایدر های آن را استفاده کنیم. برای مثال :




public void Configure(ILoggerFactory loggerFactory, IApplicationBuilder app, IHostingEnvironment env)
{

 loggerFactory.AddConsole(Configuration.GetSection("Logging"));
 .
 .
 .

}



در این حالت با استفاده از پرووایدر AddConsole بر اساس تعاریف سکشن Logging در فایل appsettings.json تمامی لاگ های برنامه در بخش console از Visual Studio نمایش داده میشود.

حالا اگر بخواهیم این لاگ ها در یک مکانی ثبت شده و قابل پیمایش شوند باید از پرووایدر های ثالث مثل elmah استفاده کنیم که البته استفاده از آن رایگان نیست، و یا اینکه باید به صورت سفارشی یک پرووایدر پیاده سازی و در برنامه از آن استفاده کنیم که این هم 2 مشکل به همراه خواهد داشت. یکی اینکه پیاده سازی و کانفیگ آن از لحاظ زمانی هزینه بر خواهد بود و دیگر اینکه نگهداری آن، زمانی که تعداد پروژه ها زیاد میشود هزینه ی دیگری اضافه خواهد کرد.



پیاده سازی لاگ به وسیله ی DbLogger.Core


در اینجا میخواهیم با یک پرووایدر آشنا شویم که با یک کانفیگ ساده، به صورت خودکار یک جدول به دیتابیس مد نظر شما اضافه کرده و تمامی رویداد های مد نظر شما را در آن لاگ میکند و سپس از طریق یک url که شما تعیین میکنید این لاگ ها قابل مشاهده و مدیریت می باشند.

نام این پرووایدر DbLogger.Core می باشد. ( آدرس نوگت -  آدرس سورس بر روی Github  )

روش استفاده از این پرووایدر بسیار ساده است. ابتدا آن را از نوگت دریافت و در برنامه نصب کنید :


pm> Install-Package DbLogger.Core

سپس کار معرفی سرویس های مربوطه در متد ConfigureServices از کلاس startup باید انجام شود:


 services.AddDbLogger(options =>
 {
 options.logLevel = LogLevel.Error; // مشخص میکند چه سطحی از لاگ باید ثبت شود
 options.Path = "DbLogs";//یک آدرس را برای دسترسی و مشاهده ی لاگها مشخص میکند
 options.ApplicationName = "DbLogger.Core.Example"; //نام اپلیکیشنی که لاگ برای آن ثبت میشود
 });


سپس باید middleware مربوط به آن را در متد Configure از کلاس startup تعریف کنیم :


 app.UseDbLogger();

حالا باید کانکشن مربوط به دیتابیس مورد نظر را در فایل appsettings.json اضافه کنیم. در این صورت یک جدول به اسم AppLogs برای نگهداری لاگ ها به دیتابیسی که در این کانکشن معرفی شده اضافه میشود:



 "ConnectionStrings": {
 "DbLoggerConnection": "Server=.;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true",
 }





تا اینجا کار ثبت و کانفیگ لاگر به درستی انجام شده. حالا کافی است برنامه را اجرا کرده و به آدرسی که برای نمایش لاگ ها تعیین کرده اید بروید. برای مثال /http://localhost:61627/DbLogs
در این صورت صفحه ی مربوط به نمایش لیست لاگ ها نمایش می یابد و میتوانید لاگ ها را برا اساس فیلترهای موجود جستجو کرده و یا جزییات آنها را مشاهده کنید.

چند نکته :

- اگر میخواهید لاگ مربوط به کل اپلیکیشن هایتان را در یک یتابیس واحد ثبت کنید کافی است در تمام این اپلیکیشن ها یک کانکشن مشترک برای DbLoggerConnection در فایل appsettings معرفی کنید.

- اگر در کانکشن دیتابیس لاگر، کانکشن دیتابیس اصلی برنامه راداده اید و نیز بیشتر از چند اپلیکیشن از این دیتابیس استفاده میکنند و یا اینکه طبق نکته ی قبلی، همه اپلیکیشن ها در یک دیتابیس واحد لاگ میزنند، حتما options.ApplicationName را با نام اپلیکیشن مربوطه مقدار دهی کنید چون در هر اپلیکیشن با فراخوانی آدرس نمایش لاگ ها فقط لاگ های مربوط به همان اپلیکیشن نمایش داده میشود.

- اگر نیاز است ویوهای مربوط به نمایش لیست و جزییات لاگها را شخصی سازی کنید کافی است پوشه های حاوی این ویوها و لایوت مربوط به آن ها را از این آدرس در سورس اصلی کپی کرده و در پوشه ی Views برنامه ی خود کپی کرده و آن ها را طبق نیاز خود ویرایش کرده و یا استایل های آنها را تغییر دهید.

- اگر نیاز دارید که در سطح کد در برنامه تان بتوانید به صورت دستی لاگ بزنید میتوانید از IAppLogService به صورت زیر استفاده کنید:




public class HomeController : Controller
 {
 private readonly IAppLogService _appLogService;

 public HomeController(IAppLogService appLogService)
 {
 _appLogService = appLogService;
 }


 public async Task Index()
 {
 var log = new AppLogInput
 {
 ApplicationName = "DbLogger.Core.Example",
 LogLevel= LogLevel.Information,
 Message="I See Home => Index",
 };
 await _appLogService.CreateAsync(log);

 return View();
 }


 }



برای بررسی مثالهای بیشتر میتوانید به سورس این لایبری و پروژه ی مثال آن بر روی گیت هاب مراجعه کنید.






نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.