log کردن خطا با کتابخانه NLog
شناسه پست: 2363
بازدید: 1777

چرا لاگ کردن در طول توسعه اپلیکیشن مهم است؟ خب، در حالیکه اپلیکیشن شما در مرحله توسعه است، خطایابی کد و فهمیدن اینکه اشکال کار کجاست خیلی راحت است. اما آیا در محیط production (مرحله استفاده از نرم افزار توسط کاربر نهایی) نیز میتوانید خطایابی کنید؟

البته که نه.

به این دلیل است که پیامهای log شده برای فهمیدن اینکه چه اشکالی در برنامه رخ داده است و خطاها کجای کد شما اتفاق افتاده است، رویکردی عالی در محیط production محسوب میشود. NET Core. برای log کردن پیغامها، شیوه های خودش را دارد. اما من در تمام پروژه های خود، ترجیح میدهم که سرویس log سفارشی خودم را داشته باشم.

این مقاله، قسمتی از مجموعه آموزشی زیر میباشد:

اگر می خواهید تمام آموزشهای لازم و پایه مربوط به این دوره آموزشی را ببینید ، لطفاً روی این لینک کلیک کنید: صفحه مقدمه برای این آموزش.

برای مطالعه قسمت قبلی، این لینک را بررسی کنید: ایجاد پروژه Net Core WebApi. – کدهای آماده سازی اولیه.

این مقاله شامل قسمتهای زیر میباشد:

ایجاد پروژه های مورد نیاز

دو پروژه جدید میسازیم. نام اولی را Contracts میگذاریم. ما میخواهیم اینترفیسها را داخل این پروژه ذخیره کنیم. نام دومی را LoggerService میگذاریم. از این پروژه برای استفاده از logger logic استفاده میکنیم.

برای ایجاد پروژه جدید، بر روی solution راست کلیک کرده، Add و سپس NewProject را انتخاب کنید. Class Library (.NET Core) را انتخاب کرده و نام آن را Contracts بگذارید:

ایجاد پروژه log خطا در Net Core.

همین کار را برای پروژه دوم نیز انجام دهید و نام آن را LoggerService بگذارید.

حال با در اختیار داشتن این دو پروژه، باید پروژه LoggerService را به پروژه اصلی رفرنس دهیم. در پروژه اصلی داخل solution explorer بر روی Dependencies راست کلیک کرده و AddReference را انتخاب کنید. در قسمت Projects، بر روی Solution کلیک کنید و تیک پروژه LoggerService را بزنید:

رفرنس دادن پروژه در Net Core.

قبل از شروع به پیاده سازی LoggerService ، یک کار دیگر نیز انجام دهیم.

در پروژه LoggerService، بر روی Dependencies راست کلیک کنید و بر روی Add Reference کلیک کنید. در داخل پنجره، تیک پروژه Contracts را برای import کردن رفرنس آن به داخل پروژه LoggerService بزنید. این کار، رفرنس Contracts را به طور خودکار به پروژه اصلی نیز اضافه میکند، زیرا از قبل، رفرنس LoggerService را داخل پروژه اصلی داریم.

ایجاد اینترفیس و نصب NLog

سرویس logger ما شامل 4 متد برای log کردن میباشد:

  • Info message ها
  • Debug message ها
  • Warning message ها
  • و error message ها

علاوه بر این، داخل پروژه Contracts، اینترفیس ILoggerManager را ایجاد میکنیم که شامل تعریف چهار متد زیر میباشد.

پس اینترفیس ILoggerManager را به شکل زیر ایجاد میکنیم:

قبل از اینکه ما این اینترفیس را داخل پروژه LoggerService پیاده سازی کنیم باید کتابخانه NLog را داخل آن نصب نماییم. NLog یک پلتفرم logging برای NET. میباشد که به ما کمک میکند تا پیغامهایمان را ایجاد و log نماییم.

ما میخواهیم برای افزودن کتابخانه NLog به پروژه، دو شیوه را به شما نشان دهیم:

  1. در پروژه LoggerService بر روی  Dependences راست کلیک کرده و Manage NuGet Packages را انتخاب کنید. بعد از اینکه پنجره NuGet باز شد مراحل زیر را دنبال کنید:
    نصب کتابخانه NLog
  2. از منوی Other Windows ،View را انتخاب کرده و سپس بر روی Package Manager Console کلیک کنید. بعد از اینکه کنسول باز شد، دستور زیر را اجرا کنید:

بعد از چند ثانیه، NLog بر روی اپلیکیشن شما اجرا میشود.

پیاده سازی اینترفیس و فایل Nlog.Config

در پروژه LoggerService، یک کلاس جدید به نام LoggerManager ایجاد کنید.

این کلاس را به صورت زیر تغییر دهید:

حالا باید آن را پیکربندی کنیم وآن را به داخل کلاس Startup، در متد ConfigureServices تزریق کنیم.

NLog باید اطلاعات پوشه ای که فایلهای log قرار است درون آن ایجاد شوند و اینکه نام این فایلها چیست و minimum level از log را بداند. بنابراین، باید یک فایل متنی در پروژه اصلی با نام nlog.config ایجاد کنیم و به مانند مثال زیر آن را تکمیل نماییم. شما باید مسیر پارامترهای internal log و filename را با مسیرهای خودتان جایگزین کنید.

پیکربندی سرویس Logger برای پیغامهای log

تنظیم پیکربندی برای یک سرویس logger، کاملا کار آسانی است.

ما سازنده کلاس Startup را به این صورت تغییر میدهیم:

در مرحله دوم ، ما باید سرویس logger را به داخل IOC container در NET Core. اضافه کنیم. سه راهکار برای این کار وجود دارد:

  • صدا زدن services.AddSingleton، سرویس را اولین باری که آن را درخواست میدهید ایجاد میکند و سپس درخواستهای بعد از آن، همان نمونه از سرویس را فراخوانی میکند. این به این معنی است که تمام کامپوننتها، فقط یک نمونه سرویس را به اشتراک میگذارند و هرزمان که به آن نیاز داشته باشند از آن استفاده میکنند. به عبارتی شما همیشه فقط از یک نمونه استفاده میکنید.
  • صدا زدن services.AddScoped، سرویس را هربار که مورد درخواست قرار میگیرد ایجاد میکند. این به این معنی است که هربار که ما یک درخواست HTTP به سمت اپلیکیشن ارسال میکنیم، یک نمونه جدید از service ایجاد میشود.
  • صدا زدن services.AddTransient، سرویس را هرزمان که اپلیکیشن آن را درخواست کند ایجاد میکند. این به این معنی است که اگر در طول یک درخواست به سمت اپلیکیشن، چند کامپوننت، آن سرویس را نیاز داشته باشند، این سرویس هربار که هر کامپوننت آن را نیاز داشته باشد ایجاد میشود.

بنابراین در کلاس ServiceExtensions، ما یک متد جدید اضافه میکنیم:

در آخر، در متد ConfigureServices، این extension method را فراخوانی میکنیم:

هر زمان که میخواهیم از این سرویس logger استفاده کنیم، تمام کاری که باید انجام دهیم این است که آن را به داخل سازنده کلاسی که قرار است از این سرویس استفاده کند تزریق کنیم. NET Core. این سرویس را از طریق IOC container به کار میگیرد و تمام feature های آن سرویس برای استفاده در دسترس قرار میگیرد. به این نوع از تزریق آبجکتها، تزریق وابستگی (Dependency Injection) گفته میشود.

DI, IOC و تست سرویس Logger

Dependency Injection(DI) و IOC (Inversion of Control) دقیقا چیست؟

Dependency injection (تزریق وابستگی) یک تکنیک loose coupling (به حداقل رساندن وابستگی) بین آبجکتها و وابستگیهایشان میباشد. این به این معنی است که به جای اینکه یک آبجکت را که هرزمان مورد نیاز بود نمونه سازی کنیم، فقط یکبار آن را نمونه سازی کرده و سپس در یک کلاس، اغلب توسط یک متد سازنده، آن را بکار گیریم. این رویکرد خاصی که استفاده میکنیم به عنوان تزریق سازنده شناخته میشود.

در یک سیستمی که برای استفاده از DI طراحی شده است، ممکن است کلاسهای زیادی را پیدا کنید که وابستگیهایشان را از طریق سازنده شان درخواست میکنند. در این حالت، خوب است که یک کلاسی داشته باشیم که همه نمونه ها را از طریق سازنده در اختیار کلاسها قرار دهد. این کلاسها به عنوان container ها یا به طور ویژه تر، به عنوان  Inversion of Control container ها معرفی میشوند. یک IOC container اساسا یک کارخانه ای است که مسئول فراهم نمودن نمونه هایی از type های مختلفی که مورد درخواست قرار میگیرند میباشد.

به منظور تست سرویس logger، ما میتوانیم از WeatherForecastController استفاده کنیم. ما می خواهیم آن را در پروژه اصلی درون پوشه Controllers ایجاد کنیم.

به این صورت آن را تغییر میدهیم:

سپس، برنامه را start کنید و به http://localhost:5000/weatherforecast بروید. در نتیجه، شما آرایه دورشته ای میبینید . حالا به پوشه ای که در فایل nlog.config تعیین نموده بودید بروید و نتیجه را بررسی کنید. شما باید چهار خط log شده را درون این فایل ببینید.

پیامهای log شده در Net Core.

نتیجه گیری

در حال حاضر، سرویس logger ای دارید که کار میکند و میتوانید آن را در سرتاسر فرآیند توسعه اپلیکیشن، از آن استفاده کنید.

با مطالعه این مقاله، یاد گرفتید که:

  • چرا log کردن اهمیت دارد
  • چطور یک سرویس external ایجاد کنیم
  • چطور از کتابخانه NLog استفاده کنیم و آن را پیکربندی کنیم
  • DI و IOC چیست
  • و چطور از DI و IOC برای تزریق سرویس استفاده کنیم

بابت مطالعه این مقاله از شما تشکر میکنیم و در مقاله بعدی، ما در مورد الگوی repository به همراه entity framework core صحبت میکنیم.

نویسنده

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

      خوشحالیم از اینکه این مقاله مورد رضایت شما دوست عزیز قرار گرفته

  1. سلام خیلی عالی بود
    روشی برای ثبت آدرس مسیر nlog در appsettings.json هم وجود داره؟
    مثلا وقتی که بخواهیم روی دیتابیس sql لاگ بگیریم.
    برای لاگ فعالیت کاربر هم میشه ازش استفاده کرد؟

    1. سلام و درود بر شما جناب آقای شاهی

      بله انجام تنظیمات در خود فایل appsetting.json نیز امکان پذیره. شما میتونید به جای ایجاد فایل متنی nlog.config از خود فایل appsetting.json استفاده کنید.
      برای این کار شما باید تنظیمات مربوط به nlog رو که ما در فایل متنی گذاشته بودیم رو به صورت زیر در فایل appsetting.gson قرار بدید:

      و سپس متد Main در فایل program.cs را برای خواندن مقادیر nlog در appsetting.json را به صورت زیر update کنید:

      در مورد لاگ کردن در دیتابیس هم باید تنظیمات مربوط به دیتابیس از جمله connection string در فایل nlog.config و یا در همون فایل appsetting.json انجام بشه که در این صورت اطلاعات لاگ درون دیتابیس ثبت میشه که بعدا یک مقاله کامل هم برای این منظور آماده میکنیم.
      و در مورد سوال آخرتون، هرچیزی که بخواید رو میتونید با nlog لاگ کنید.

      موفق باشید

  2. با تشکر فراوان از اینکه دانش و آموخته های خود را در اختیار عموم قرار می دهید .
    خیلی عالیییی