آموزش NLog

name-god

سلام دوستان ، در خدمتتون هستیم با آموزش nLog که یکی از بهترین ابزار های موجود برای عمل لاگ گیری می باشد . در وب سایت Dotnetlogging لیست کاملی از انواع ابزارهای لاگ گیری را برای دات نت مشاهده می فرمایید .

NLog : Flexible & free open-source logging for .NET

تعریف Log :

لاگ گیری به عمل ذخیره سازی اطلاعات درباره خطاها و رخدادهایی که در حین اجرای پروژه اتفاق می افتد را گویند که معمولا این ذخیره سازی با نوشتن در فایل text متنی همراه است .

نصب NLog :

برای نصب nLog دو روش داریم . یکی اینکه مانند قبل به وب سایت nuGet رفته و فرمان مربوط به نصب nLog را کپی کرده و سپس در کنسول نوگت پیست کنیم . روش دیگر اینست که به وب سایت مرجع NLog برویم و با زدن دکمه Download NLog به صفحه ای برویم که دستور مربوط به نصب را نوشته است .

دستور نصب NLog با تمام امکانات :

Install-Package NLog.Config

NLog Logo

با نصب NLog ، دو تا فایل بنام های NLog.config , NLog.xsd به روت پروژه اضافه می شود . ما در این آموزش به فایل NLog.xsd کاری نداریم blush

شروع کار با NLog :

به این منظور ، باید فولدری بنام Infrastructure در روت پروژه ایجاد کنیم (دقت کنید که نام این فولدر اختیاریست ولی بهتر است Infrastructure باشد) و سپس در این فولدر یک کلاس Add میکنیم بنام LoggerProxy.cs که نام کلاس هم دلخواه است . 

کلاس LoggerProxy را Public static تعریف میکنیم :

 public static class LoggerProxy { }

سپس یک Enumeration بنام Levels تعریف میکنیم که انواع رخدادهایی که ممکن است برای پروژه اتفاق بیافتد را در آن بیان میکنیم :

                         
public enum LogLevels : int
{
    Trace = 0,
    Debug = 1,
    Info = 2,
    Warn = 3,
    Error = 4,
    Fatal = 5,
}
                                

در این مرحله برای کلاس خود یک سازنده بصورت زیر تعریف میکنیم :

 static LoggerProxy()
        {

        }

تابع اصلی این کلاس یعنی Log را بصورت زیر تعریف میکنیم که در این مثال دارای ۵ پارامتر ورودی می باشد (تعداد پارامترها متغیر است ممکن است کمتر یا بیشتر از ۵ پارامتر به ان ارسال شود) :

public static void Log
            (LogLevels level,System.Type type,string message,System.Exception exception=null,params object[] args)

پارامتر اول این تابع level می باشد که از نوع enum می باشد که در بالا تعریف کردیم که ۶ عضو دارد . پارامتر بعدی یعنی type ، نوع کلاسی است که در آن متد Log صدا زده می شود (مانند NameSpace ها) . پارامتر بعدی message است . پیغامی است که می خواهیم به ازای رخداد موردنظر در فایل لاگ نوشته شود . پارامتر بعدی exception است که در هنگام بروز خطاها استفاده میشود و مثلا در موقع info این پارامتر null است . پس با مساوی null قرار دادن آن ، آنرا اختیاری یا optional تعریف کرده ایم . و پارامتر آخر نیز آرگومان ها می باشند که می توان از صفر تا بینهایت به آن پارامتر ارسال کنیم .

بدنه تابع فوق نیز بصورت زیر است :

                         
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 Configuration شویم . بصورت پیش فرض ، یک تنظیماتی در فایل NLog.config در نظر گرفته می شود که می توان بر اساس نیاز خود ، این تنظیمات را تغییر دهیم و سفارشی کنیم . قابلیتهای جالبی در این بخش وجود دارد . همراه ما باشید تا آنها را بیان کنیم :

دستورات پیش فرض بصورت زیر می باشند :

                         

    
    
  
  
  

                                

المان targets بیانگر محل ذخیره سازی و یا نحوه ارسال لاگ (Log) می باشد و در rules نیز نوع رخداد و محل رخداد event ها را تعیین می کنیم .

با ذکر یک مثال قضیه را واضح تر میکنیم :

مثال اول :

                         

    


    
 
                           

در مثال فوق داریم :

  • در المان 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 ثبت کرده ایم و ….

 

مثال سوم :

در مثال بعد می خواهیم تنظیماتی انجام دهیم که علاوه بر اینکه تمام لاگ ها را در File1 ثبت میکند ، رخدادهای Fatal را بدلیل اهمیتشان ، در فایل جداگانه ای ثبت کند :

                         

    
    


    
    

                           

مثال چهارم :

رویکرد این مثال در مورد target می باشد . میخواهیم رخدادهای Target1 روزانه در فایل متنی مجزا نوشته شوند و Target2 به ایمیل مدیر سایت ارسال شوند :

                         

    
        
        
    

                           

همانطور که می بینید در Target1 پارامتر archiveEvery را برابر Day قرار دادیم . بنابراین هر روز ، رویدادهای همان روز را داخل فایلی بنام File1+Date ثبت میکند که Date تاریخ آنروز است .

در Target2 نیز رویدادها را به ایمیل دلخواه میفرستیم که دارای پارامترهای بسیاری است و مربوط به پروتکل smtp می باشد .

آموزش NLog در اینجا به پایان میرسد . امیدوارم استفاده لازم را برده باشید . لطفا دیدگاه ها و نظرات خود را درباره این مقاله ارسال نمایید wink

*** برای آموزش بیشتر NLog میتوانید به وب سایت GitHub مراجعه کنید .

نویسنده : احسان صفری — با تشکر ویژه از جناب آقای مهندس داریوش تصدیقی


تاریخ انتشار : ۱۳ دی ۱۳۹۴



دیدگاه ها :