آموزش ابزار لاگگیری nLog برای داتنت

معرفی ابزار مدیریت لاگ nLog و نحوه استفاده از آن در NET.
سلام دوستان ، در خدمتتون هستیم با آموزش nLog که یکی از بهترین ابزار های موجود برای عمل لاگ گیری می باشد . در وب سایت Dotnetlogging لیست کاملی از انواع ابزارهای لاگ گیری را برای دات نت مشاهده می فرمایید .
تعریف عملیات لاگگیری (Logging):
لاگ گیری به عمل ذخیره سازی اطلاعات درباره خطاها و رخدادهایی که در حین اجرای پروژه اتفاق می افتد را گویند که معمولا این ذخیره سازی با نوشتن در فایل text متنی همراه است .
نحوه نصب NLog :
برای نصب nLog دو روش داریم . یکی اینکه مانند قبل به وب سایت nuGet رفته و فرمان مربوط به نصب nLog را کپی کرده و سپس در کنسول نوگت پیست کنیم . روش دیگر اینست که به وب سایت مرجع NLog برویم و با زدن دکمه Download NLog به صفحه ای برویم که دستور مربوط به نصب را نوشته است .
دستور نصب NLog با تمام امکانات :
Install-Package NLog.Config
با نصب NLog ، دو تا فایل بنام های NLog.config , NLog.xsd به روت پروژه اضافه می شود . ما در این آموزش به فایل NLog.xsd کاری نداریم
شروع کار با NLog :
به این منظور ، باید فولدری بنام Infrastructure در روت پروژه ایجاد کنیم (دقت کنید که نام این فولدر اختیاریست ولی بهتر است Infrastructure باشد) و سپس در این فولدر یک کلاس Add میکنیم بنام LoggerProxy.cs که نام کلاس هم دلخواه است .
کلاس LoggerProxy را Public static تعریف میکنیم :
public static class LoggerProxy { }
تعریف متغیری با نوع enum:
سپس یک Enumeration بنام Levels تعریف میکنیم که انواع رخدادهایی که ممکن است برای پروژه اتفاق بیافتد را در آن بیان میکنیم :
public enum LogLevels : int { Trace = 0, Debug = 1, Info = 2, Warn = 3, Error = 4, Fatal = 5, }
تعریف سازنده (Constructor) برای کلاس:
در این مرحله برای کلاس خود یک سازنده بصورت زیر تعریف میکنیم :
static LoggerProxy(){ }
تعریف تابع اصلی Log:
تابع اصلی این کلاس یعنی Log را بصورت زیر تعریف میکنیم که در این مثال دارای 5 پارامتر ورودی می باشد (تعداد پارامترها متغیر است ممکن است کمتر یا بیشتر از 5 پارامتر به ان ارسال شود) :
public static void Log (LogLevels level,System.Type type,string message,System.Exception exception=null,params object[] args)
پارامترهای تابع Log:
پارامتر اول این تابع level می باشد که از نوع enum می باشد که در بالا تعریف کردیم که 6 عضو دارد . پارامتر بعدی یعنی type ، نوع کلاسی است که در آن متد Log صدا زده می شود (مانند NameSpace ها) . پارامتر بعدی message است . پیغامی است که می خواهیم به ازای رخداد موردنظر در فایل لاگ نوشته شود . پارامتر بعدی exception است که در هنگام بروز خطاها استفاده میشود و مثلا در موقع info این پارامتر null است . پس با مساوی null قرار دادن آن ، آنرا اختیاری یا optional تعریف کرده ایم . و پارامتر آخر نیز آرگومان ها می باشند که می توان از صفر تا بینهایت به آن پارامتر ارسال کنیم .
بدنه تابع Log:
بدنه تابع فوق نیز بصورت زیر است :
NLog.Logger oLogger = NLog.LogManager.GetLogger(type.ToString()); switch (level) { case LogLevels.Debug: { oLogger.Debug(exception: exception, message: message, args: args); break; } case LogLevels.Error: { oLogger.Error(exception: exception, message: message, args: args); break; } case LogLevels.Fatal: { oLogger.Fatal(exception: exception, message: message, args: args); break; } case LogLevels.Info: { oLogger.Info(exception: exception, message: message, args: args); break; } case LogLevels.Trace: { oLogger.Trace(exception: exception, message: message, args: args); break; } case LogLevels.Warn: { oLogger.Warn(exception: exception, message: message, args: args); break; } }
مشاهده می شود که بر اساس نوع رخداد در پروژه ، یک event در لاگ موردنظر ایجاد شده است .
استفاده از متد Log :
به این منظور یک کنترولر بنام HomeController می سازیم و در آن یک اکشن بنام دلخواه مثلا LogSample تعریف میکنیم :
public ActionResult LogSample() { Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Debug, GetType(),"Debug …!"); Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Error, GetType(), "Error …!"); Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Fatal, GetType(), "Fatal Error …!"); Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Info, GetType(), "Info …!"); Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Trace, GetType(), "Trace …!"); Infrastructure.LoggerProxy.Log(Infrastructure.LoggerProxy.LogLevels.Warn, GetType(), "Warn …!"); return View(); }
همانطور که مشاهده میکنید بعد از ذکر namespace تابعی که نوشتیم و سپس نام کلاس و درنهایت نام متد Log ، پارامترهای آن تابع را ارسال کرده ایم .
تنظیمات NLog در فایل nlog.config:
حال میخواهیم وارد بحث NLog Configuration شویم . بصورت پیش فرض ، یک تنظیماتی در فایل NLog.config در نظر گرفته می شود که می توان بر اساس نیاز خود ، این تنظیمات را تغییر دهیم و سفارشی کنیم . قابلیتهای جالبی در این بخش وجود دارد . همراه ما باشید تا آنها را بیان کنیم :
دستورات پیش فرض بصورت زیر می باشند :
<?xml version="1.0" encoding="utf-8" ?> <nlog autoreload="true" internallogfile="c:\temp\nlog-internal.log" internalloglevel="Off" throwexceptions="false" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"> <targets></targets> <rules></rules> </nlog>
المان targets بیانگر محل ذخیره سازی و یا نحوه ارسال لاگ (Log) می باشد و در rules نیز نوع رخداد و محل رخداد event ها را تعیین می کنیم .
مثالی از تعریف المان target و rule:
با ذکر یک مثال قضیه را واضح تر میکنیم.
در مثال فوق داریم :
- در المان target ابتدا نام آنرا نوشتیم که دلخواه می باشد و سپس نوع لاگ گیری را بیان کرده ایم که در این مثال File است یعنی لاگ ها را داخل فایل متنی بنویس و نام این فایل نیز File1.txt می باشد .
- در المان rule مثال فوق ، ابتدا نام آنرا مشخص میکنیم که * بیانگر تمام نام هاست . منظور از نام همان type در متد Log می باشد . بعنوان مثال اگر تابع Log را در کلاس program.cs صدا بزنیم که این کلاس در BLL NameSpace تعریف شده است و نام پروژه نیز MyApp باشد در این حالت پارامتر name برابر MyApp.BLL.program.cs می شود .
- پارامتر minLevel نیز بیانگر نوع رخدادیست که میخواهیم لاگ گیری شود . در این مثال گفتیم minlevel برابر Trace باشد یعنی از کل رخدادهای پروژه لاگ گیری شود . زیرا Trace اولین level است و سایر رخدادها زیر مجموعه آن می باشند .
- در پارامتر writeTo نیز گفتیم event های این rule را در Target1 ذخیره کن .
مفهوم کلی مثال فوق » هر اتفاقی که بیوفتد و در هر namespace ای که باشد ، در فایل File1.txt ثبت می شود .
مثالی برای ثبت لاگ هر نوع رخداد:
در این مثال می خواهیم لاگ های مربوط به هر نوع رخداد را در فایل جداگانه ای ثبت کنیم :
مشاهده می شود که لاگ های از نوع Trace را در فایل File1.txt ثبت کرده ایم و لاگ های از نوع Debug را در فایل File2.txt ثبت کرده ایم و ….
مثالی برای ثبت رخدادهای مهم Fatal:
در مثال بعد می خواهیم تنظیماتی انجام دهیم که علاوه بر اینکه تمام لاگ ها را در File1 ثبت میکند ، رخدادهای Fatal را بدلیل اهمیتشان ، در فایل جداگانه ای ثبت کند :
مثالی برای ثبت رویدادها در یک فایال متنی و یا ارسال ایمیل:
رویکرد این مثال در مورد target می باشد . میخواهیم رخدادهای Target1 روزانه در فایل متنی مجزا نوشته شوند و Target2 به ایمیل مدیر سایت ارسال شوند :
<targets> <wrapper-target xsi:type="AsyncWrapper"> <target archiveevery="Day" filename="File1.txt" name="Target1" xsi:type="File"> <target addnewlines="true" enablessl="false" encoding="utf-8" html="true" name="Target2"> priority="" smtpauthentication="Basic" smtppassword="" smtpport="25" smtpserver="" smtpusername="" to="" usesystemnetmailsettings="false" xsi:type="Mail" > </target></target></wrapper-target> </targets>
شرح مثال فوق:
همانطور که می بینید در Target1 پارامتر archiveEvery را برابر Day قرار دادیم . بنابراین هر روز ، رویدادهای همان روز را داخل فایلی بنام File1+Date ثبت میکند که Date تاریخ آنروز است . در Target2 نیز رویدادها را به ایمیل دلخواه میفرستیم که دارای پارامترهای بسیاری است و مربوط به پروتکل smtp می باشد .
آموزش ابزار لاگ گیری NLog در اینجا به پایان میرسد . امیدوارم استفاده لازم را برده باشید . لطفا دیدگاه ها و نظرات خود را درباره این مقاله ارسال نمایید
*** برای آموزش بیشتر NLog میتوانید به وب سایت GitHub مراجعه کنید .
دیدگاهتان را بنویسید