آشنایی با نحوه کار کردن با NLog در ASP.NET

کار کردن با NLog در ASP.NET بسیار مهم است، ما در این مطلب قصد داریم کمی بیشتر درباره NLog در ASP.NET صحبت کنیم و اطلاعاتی به شما ارائه دهیم.

 آشنایی با نحوه کار کردن با NLog در ASP.NET

آکادمی برنامه نویسان ، برگزار کننده دوره های آموزش برنامه نویسی با استفاده از اساتید مجرب و حرفه ای در سراسر ایران .

[ جهت مشاهده دوره های درحال ثبت نام کلیک کنید ]

ارائه مدارک معتبر آموزشی و ورود به بازار کار .

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

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


ساخت یک پروژه ASP.NET در ویژوال استودیو

در ابتدا اجازه دهید که یک پروژه ASP.NET در ویژوال استودیو نسخه 2019 بسازیم، ما فرض می کنیم که این IDE بر روی سیستم شما نصب شده است بنابراین گام های زیر را دنبال کنید تا به این ترتیب بتوانید یک پروژه ASP.Net Core MVC در ویژوال استودیو بسازید.

1-      ویژوال استودیو را اجرا کنید

2-      بر روی گزینه Create new project کلیک کنید.

3-      در پنجره Create new project که برای شما باز می شود گزینه ASP.Net Core Web Application را از لیستی که برای شما نمایش داده می شود، انتخاب کنید.

4-      در پنجره Configure your new project که برای شما باز می شود نام و لوکیشن مد نظر خود برای این پروژه را انتخاب کنید.

5-      در صورت تمایل تیک گزینه Place solution and project in the same directory را بزنید.

6-      بر روی گزینه Create کلیک کنید.

7-      در پنجره Create a New ASP.Net Core Web Application که برای شما نمایش داده می شود گزینه .Net Core را به عنوان ران تایم و ASP.Net Core 2.2 و یا نسخه های بعدی را از لیستی که برای شما نمایش داده می شود انتخاب کنید.

8-      گزینه Web Application (Model-View-Controller) را به عنوان قالب پروژه خود برای ساخت پروژه ASP.NET انتخاب کنید.

9-      اطمینان حاصل کنید که گزینه های Enable Docker Support و Configure for HTTPS انتخاب نشده باشند چرا که ما قصد استفاده از آنها را نداریم.

10-  اطمینان حاصل کنید که گزینه Authentication بر روی مقدار No Authentication تنظیم شده باشد چرا که ما قصد استفاده از آن را نیز نداریم.

11-  بر روی گزینه Create کلیک کنید.

ما در بخش های بعدی از این پروژه استفاده خواهیم کرد تا به شما نمایش دهیم که چگونه می توانید با NLog در ASP.Net کار کنید.

 NLog در ASP.NET


نصب پکیج های NuGet برای استفاده از NLog در ASP.NET

در ابتدا پکیج هایی که در ادامه بیان می کنیم را نصب کنید که این کار را باید از طریق پکیج منیجر NuGet و یا پکیج منیجر کنسول NuGet انجام دهید:

-          NLog.Web.AspNetCore

-          NLog.Extensions.Logging

-          NLog.Config

زمانی که شما این پکیج ها را نصب کردید فایلی که NLog.config نامیده می شود همراه با تمامی وابستگی های آن به پروژه شما اضافه می شود. توجه داشته باشید که این پکیج برای کار کردن با NLog در ASP.NET آماده نشده است، این پکیج در واقع تنها زمانی نیاز است که شما قصد داشته باشید از NLog در ASP.NET در یک فایل پیکربندی استفاده کنید که این کار جایگزین پیکربندی code-based است.

 NLog در ASP.NET


پیکربندی NLog در ASP.NET با استفاده از یک فایل .config

NLog در ASP.NET از هر دو نوع پیکربندی .config مبتنی بر فایل و مبتنی بر کد پشتیبانی می کند. زمانی که شما پکیج NLog.Config را در پروژه خود نصب می کنید فایلی که NLog.config نامیده می شود در پروژه شما ساخته می شود که دارای محتوای زیر است:

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

auto Reload="true">

  <extensions>

    <add assembly="NLog.Web.AspNetCore"/>

  </extensions>

  <targets>

    <target name="logfile" xsi:type="File" fileName="D:\logs\Log Messages-${shortdate}.log" />

  </targets>

  <rules>

    <logger name="*" min level="Trace" writeTo="logfile" />

  </rules>

</nlog>

قطعه کد زیر به شما نشان می دهد که چگونه می توانید از NLog در ASP.NET استفاده کنید تا داده ها را در متدهای اکشن خود لاگ کنید.

public class Home Controller : Controller

 {

     Logger _logger =

     (Logger)Log Manager.Get Current Class Logger(typeof(Logger));

     public IActionResult Index()

      {

         _logger.Info("Application started");       

          return View();

      }

    //Other action methods

  }

اگر شما قصد دارید هدف را با استفاده از برنامه نویسی پیدا کنید شما می توانید از قطعه کد زیر استفاده کنید:

var fileTarget = (FileTarget)Log Manager.Configuration.FindTargetByName("logfile");

 NLog در ASP.NET


پیکربندی NLog با استفاده از پیکربندی بر پایه کد

شما می توانید NLog در ASP.NET را با استفاده از برنامه نویسی پیکربندی کنید، برای انجام این کار شما باید از API مربوط به NLog در ASP.NET استفاده کنید. متد زیر نشان می دهد که چگونه ما می توانیم NLog را با استفاده از برنامه نویسی پیکربندی کنیم.

private static void ConfigureNLog()

        {

            var log Configuration = new Logging Configuration();

            var dbTarget = new DatabaseTarget();

            dbTarget.ConnectionString = "Data Source=JOYDIP;initial

            catalog=NLogDemo;User Id=sa;Password=sa1@3#.;";

            dbTarget.CommandText = "INSERT INTO DbLog

           (level, callsite, message, log datetime)" +

                " Values(@level, @callsite, @message, @log datetime)";

            dbTarget.Parameters.Add

            (new Database ParameterInfo("@level", "${level}"));

            dbTarget.Parameters.Add

            (new DatabaseParameterInfo("@callSite", "${callSite}"));

            dbTarget.Parameters.Add

            (new Database ParameterInfo("@message", "${message}"));

            dbTarget.Parameters.Add

            (new Database ParameterInfo("@log datetime","${date:s}"));

            var rule = new LoggingRule("*", Log Level.Debug, dbTarget);

            log Configuration.LoggingRules.Add(rule);

            Log Manager.Configuration = log Configuration;

        }


 NLog در ASP.NET


چگونه با استفاده از NLog لاگ ها را به صورت خودکار بچرخانید

شما می توانید NLog در ASP.NET را پیکربندی کنید تا به صورت خودکار لاگ های شما را بچرخاند. به عنوان مثال می توانید آن را پیکربندی کنید تا لاگ ها را برای n روز آخر نگهداری کنید و باقی لاگ ها را به صورت خودکار حذف کنید. این ویژگی به شدت برای تولید مفید است در غیر این صورت شما برای حذف این لاگ های قدیمی مجبور هستید که به صورت دستی عمل کنید. قطعه کد زیر نشان می دهد که چگونه می توانید چرخش خودکار NLog در ASP.NET را با استفاده از پیکربندی مبتنی بر فایل پیاده سازی کنید.

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

auto Reload="true">

      <targets>

    <target name="logfile"

            xsi:type="File"

            fileName="${basedir}/logs/App.log"

            layout="${longdate}  ${message}"

            archiveFileName="${basedir}/logs/archive.{#}.log"

            archiveEvery="Day"

            archive Numbering="Rolling"

            maxArchiveFiles="7"

            concurrentWrites="true"

            keepFileOpen="true" />

  </targets>

  <rules>

    <logger name="*" minlevel="Info" writeTo="logfile" />

  </rules>

</nlog>

 NLog در ASP.NET


ساخت یک دیتابیس برای استفاده از NLog در ASP.NET و دیتابیس ASP.NET

شما می توانید از NLog در ASP.NET برای لاگ کردن داده ها در دیتابیس استفاده کنید، در اینجا اسکریپتی را برای شما آورده ایم که با استفاده از آن می توانید یک جدول در دیتابیس ایجاد کنید که ما از آن برای لاگ کردن داده ها استفاده می کنیم.

CREATE TABLE [dbo].[DbLog](

      [Id] [int] IDENTITY(1,1) NOT NULL,

      [Level] [varchar](max) NULL,

      [CallSite] [varchar](max) NULL,

      [Message] [varchar](max) NULL,

      [AdditionalInfo] [varchar](max) NULL,

      [LogDateTime] [datetime] NOT NULL,

 CONSTRAINT [PK_DbLogs] PRIMARY KEY CLUSTERED

(

      [Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

 NLog در ASP.NET


تعیین اتصال دیتابیس و ویژگی های دستور متنی

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

<target name="database" xsi:type="Database" keep Connection="true"

 use Transactions="true"

 dbProvider="System.Data.SqlClient"

 connection String="data source=localhost;initial

 catalog=NLogDemo;integrated security=false;

 persist security info=True;User ID=sa;Password=sa1@3#."

 command Text="INSERT INTO DbLog (level, callsite, message, additionalInfo,

 log datetime) Values (@level, @callsite, @message, @additionalInfo,

 @log datetime)">

بعد از آن شما باید هدف و مقصد فایل NLog.config را تعیین کنید بنابراین شما می توانید داده های خود را در دیتابیس لاگ کنید.

<target name="database" xsi:type="Database" keep Connection="true" useTransactions="true" dbProvider="System.Data.SqlClient"

connectionString="data source=localhost;initial catalog=NLogDemo;integrated security=false;persist security info=True;User ID=sa;Password=sa1@3#."

commandText="INSERT INTO DbLog (level, callsite, message, additionalInfo, logdatetime) Values (@level, @callsite, @message, @additionalInfo, @logdatetime)">

</target>

در مرحله بعدی شما نیاز دارید که پارامترها را از NLog در ASP.NET به داخل دیتابیس مپ کنید، این کار را می توانید با کمک قطعه کد زیر به راحتی هرچه تمام انجام دهید:

<parameter name="@level" layout="${level}" />

<parameter name="@callSite" layout="${callsite}" />

<parameter name="@message" layout="${message}" />

<parameter name="@additionalInfo" layout="${var:AdditionalInfo}" />

<parameter name="@logdatetime" layout="${date:s}" />

 NLog در ASP.NET


لاگ کردن به داخل دیتابیس با استفاده از NLog در ASP.NET

کد کامل فایل NLog.config مانند شکل زیر است که برای منبع شما مورد استفاده قرار می گیرد:

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

autoReload="true">

  <extensions>

    <add assembly="NLog.Web.AspNetCore"/>

  </extensions>

  <variable name="AdditionalInfo" value=""/>

  <targets>

    <target name="database" xsi:type="Database" keepConnection="true"

    useTransactions="true"

    dbProvider="System.Data.SqlClient"

    connection String="data source=localhost;initial

    catalog=NLogDemo;integrated security=false;persist security

    info=True;User ID=sa;Password=sa1@3#."

    commandText="INSERT INTO DbLog

    (level, callsite, message, additionalInfo, logdatetime)

    Values (@level, @callsite, @message, @additionalInfo, @logdatetime)">

      <parameter name="@level" layout="${level}" />

      <parameter name="@callSite" layout="${callsite}" />

      <parameter name="@message" layout="${message}" />

      <parameter name="@additionalInfo" layout="${var:AdditionalInfo}" />

      <parameter name="@logdatetime" layout="${date:s}" />

    </target>       

  </targets>

  <rules>

    <logger levels="Debug,Info,Error,Warn,Fatal" name="databaseLogger" writeTo="database"/>

  </rules>

</nlog>

علاوه بر این برای کار کردن با Microsoft SQL Server شما می توانید از NLog در ASP.NET برای لاگ کردن داده در سایر دیتابیس ها مانند MySQL، دیتابیس  Oracle و SQLite استفاده کنید.

 NLog در ASP.NET


بهبود عملکرد NLog با استفاده از Async Wrapper

NLog در ASP.NET از بسیاری از اهداف پشتیبانی می کند که از جمله آنها می توان به Async Wrapper، Buffering Wrapper، Fallback Group و Retrying Wrapper اشاره کرد. Asynchronous target wrappers شما را قادر می سازد تا پیغام ها را به یک صف منتقل کنید و آنها را در یک thread جدا برای بهبود عملکرد پردازش کنید. قطعه کد زیر، کاری که برای این منظور باید انجام دهید را به شما نشان می دهد:

<targets>

  <target xsi:type="Async Wrapper"

          name="String"

          queueLimit="Integer"

          timeToSleepBetweenBatches="Integer"

          batchSize="Integer"

          overflowAction="Enum">

    <target ... />

  </target>

</targets>

شما می توانید از مزایای asynchronous wrapper استفاده کنید و یک فایل هدف را داخل آن محصور کنید تا به این شکل بتوانید داده ها را به صورت همزمان در داخل دیتابیس لاگ کنید که ما این کار را در قطعه کد زیر به شما نشان داده ایم:

<targets>

    <target name="asyncFile" xsi:type="AsyncWrapper">

      <target xsi:type="File" name="fileLog"

         fileName="${basedir}/Logs/${shortdate}.log"

            layout="${longdate} ${uppercase:${level}} ${message}"/>

    </target>

  </targets>

  <rules>

    <logger levels="Debug,Info,Error,Warn,Fatal" writeTo="asyncFile"/>

  </rules>

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

<targets async="true">

  ... Write your targets here ...

</targets>


 NLog در ASP.NET


بهترین تمرین برای کار کردن با NLog

در این بخش برخی از بهترین تمرین ها که شما در زمان کار کردن با NLog در ASP.NET باید دنبال کنید را برای شما لیست کرده ایم.

1-      یک شی لاگ کننده حتما باید استاتیک باشد. این موضوع برای جلوگیری از پردازش چند باره است که شی لاگ کننده را وادار می کند که برای چندین بار ساخته شود.

2-      از مزایای پشتیبانی NLog در ASP.NET از فرمت کردن( زمانی که شما در حین استفاده از NLog در ASP.NET نیازمند لاگ کردن داده ساختارها هستید) برای جلوگیری از تخصیص رشته ها و بهم پیوستن آنها استفاده کنید.

3-      throwConfigExceptions را برابر true قرار دهید تا اطمینان حاصل کنید که NLog در ASP.NET در صورتی که مسئله ای درباره پیکربندی NLog در ASP.NET وجود داشته باشد جزئیات را برای شما فراهم می کند. به عنوان مثال:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd>"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

autoReload="true" throwConfigExceptions="true">

4-      یک فراخوانی از متد Shutdown را ایجاد کنید که در کلاس LogManager قرار دارد تا به این ترتیب همه تردهای داخلی و تایمرها را زمانی که کار شما برای لاگ کرده داده ها با استفاده از NLog تمام می شود ببندید:

NLog.LogManager.Shutdown();

5-      اطمینان حاصل کنید که شما ویژگی های Async را با ویژگی های AsyncWrapper ترکیب نکرده اید، اگر شما آنها را ترکیب کنید پردازش شما بسیار کند خواهد بود.

6-      شما باید به ندرت از سطح لاگ Trace استفاده کنید چرا که Trace بیان می کند که شما در حال لاگ کردن همه چیز هستید. به جای آن می توانید از سطح لاگ دیباگ یا Info استفاده کنید.

7-      اگر چه NLog در ASP.NET بسیار سبک و سریع است ولی با این حال شما می توانید حتی عملکرد آن را با استفاده از asynchronous wrappers بهتر کنید.

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