لاگ کرنے کے لیے این لاگ استعمال کریں

صفحہ تخلیق تاریخ :

ماحول

بصری سٹوڈیو
  • ویژیول سٹوڈیو 2019
ASP.NET کور
  • 5.0 (ایم وی سی، ریزر صفحہ)

پہلے تو

این لاگ آپ کو اپنی ترتیبات کے لحاظ سے فائلوں، ای میلز اور ڈیٹا بیسمیں لاگ آؤٹ پٹ کرنے کی اجازت دیتا ہے۔

این لاگ کو کور کے معیاری لاگنگ سسٹم میں شامل کیا ASP.NET۔ طے شدہ لاگر استعمال کرتے وقت ترتیبات کے مطابق لاگ آؤٹ پٹ کرنا ممکن ہے۔

لاگ لیول کے بارے میں

مائیکروسافٹ لاگ اور این لاگز کو چھ مراحل میں تقسیم کیا گیا ہے، اور پیداوار کی سطح تقریبا ایک ہی ہے:

سطح مائیکروسافٹاین لاگ
0 عکس عکس
1 ڈی بگ ڈی بگ
2 معلومات معلومات
3 تنبیہ تنبیہ
4 نقص نقص
5 اہم مہلک
(6) (کوئی نہیں) (آف)

سطح جتنی زیادہ ہوگی، لاگ اتنا ہی اہم ہوگا، اور لاگ آؤٹ پٹ کی رکاوٹوں سے قطع نظر اسے لکھنے کا امکان اتنا ہی زیادہ ہوگا۔

لاگنگ ہدایات

این لاگ پیکج تعیناتی

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"
      autoReload="true"
      internalLogLevel="Info"
      throwConfigExceptions="true"
      internalLogFile="${basedir}/internal-nlog-AspNetCore.txt">

  <!-- ログの出力レイアウトを変数 layoutDefine で定義 -->
  <variable name="layoutDefine"
            value="${longdate} [${event-properties:item=EventId_Id:whenEmpty=0}][${level:padding=-5}] ${message} ${exception:format=tostring} (${callsite:includeNamespace=false:fileName=true:includeSourcePath=false})" />

  <!-- 書き込むターゲット -->
  <targets>
    <!-- Visual Studio の出力 (デバッグ) に書き込みます -->
    <target xsi:type="Trace" name="TraceOutput" rawWrite="true" layout="${layoutDefine}" />

    <!-- 基本的な詳細を含むすべてのログメッセージのファイルターゲット -->
    <target xsi:type="File" name="FileOutput" fileName="${aspnet-appbasepath}/Log-${shortdate}.log" layout="${layoutDefine}" />

    <!-- Docker / Visual Studio の起動検出を改善するためにライフタイムメッセージをホストするためのコンソールターゲット  -->
    <target xsi:type="Console" name="LifetimeConsole" layout="${level:truncate=4}\: ${logger}[0]${newline}      ${message}${exception:format=tostring}" />
  </targets>

  <!-- ロガー名からターゲットにマップするルール -->
  <rules>
    <!-- Microsoft からのものを含むすべてのログ -->
    <logger name="*" writeTo="TraceOutput" />

    <!-- 起動の検出を高速化するために、ホスティングライフタイムメッセージをコンソールターゲットに出力します。Microsoft.Hosting.Lifetime はここより下の定義には出力しません -->
    <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="LifetimeConsole" final="true" />

    <!-- 重要でない Microsoft ログをスキップして、自分のログのみをログに記録する。システムが出す Warning 以上のログ以外はここより下の定義には出力されません -->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <logger name="System.Net.Http.*" maxlevel="Info" final="true" />

    <!-- 上記で除外したもの以外をファイルに出力 -->
    <logger name="*" writeTo="FileOutput" />
  </rules>
</nlog>

اس بات کو یقینی بنائیں کہ این ایل او جی ڈاٹ کنفیگ کی خصوصیات عمل بنانے کے لیے سیٹ ہیں: مواد، آؤٹ پٹ ڈائریکٹری میں نقل کریں: اگر نیا ہو تو نقل کریں۔

ایپ سیٹنگ ڈاٹ جے سن میں ترمیم کریں

طے شدہ طور پر، چاہے آپ این ایل او جی ڈاٹ کنفیگ کیسے سیٹ کریں، Information صرف یہ سطحیں آؤٹ پٹ ہیں۔ اس کی وجہ یہ ہے کہ لاگنگ کا انحصار ایپ سیٹنگ ڈاٹ جے سن پر بھی ہے۔

ایپ سیٹنگ ڈاٹ جے سن کھولیں Logging.LogLevel.Default اور قدر کو تبدیل Trace کریں۔ اگر آپ این لاگ استعمال کرتے ہیں، تو آپ این لاگ سائیڈ پر سطح کو ایڈجسٹ کر سکتے ہیں، تاکہ آپ ایپ سیٹنگ ڈاٹ جے سن سیٹ کرکے عملا تمام سطحوں کو آؤٹ پٹ کر Trace سکیں۔

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

اس کے علاوہ، ترقی کے دوران، تشخیص ات. ڈویلپمنٹ ڈاٹ جے سن سیٹنگز لوڈ کی جاتی ہیں، لہذا ہم انہیں بھی تبدیل کر رہے ہیں۔

{
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

این لاگ کے لیے پروگرام تیار کر رہا ہے

پروگرام شامل کریں تاکہ آپ این لاگ میکانزم میں لاگ ان کر سکیں۔

پروگرام مسل .cs کھولیں اور اسے درج ذیل کے مطابق ٹھیک کریں:

using NLog.Web;  // 追加

// 省略

public class Program
{
  public static void Main(string[] args)
  {
    var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    try
    {
      CreateHostBuilder(args).Build().Run();
    }
    catch (Exception exception)
    {
      // NLog:セットアップエラーをキャッチ
      logger.Error(exception, "例外のためにプログラムを停止しました。");
      throw;
    }
    finally
    {
      // アプリケーションを終了する前に、内部タイマー/スレッドをフラッシュして停止するようにしてください
      // (Linux でのセグメンテーション違反を回避してください)
      NLog.LogManager.Shutdown();
    }
  }

  public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
      {
        webBuilder.UseStartup<Startup>();
      })
      .ConfigureLogging(logging =>
      {
        logging.ClearProviders();                 // NLog 以外で設定された Provider の無効化.
        logging.SetMinimumLevel(LogLevel.Trace);  // 最小ログレベルの設定
      })
      .UseNLog();  // NLog:依存性注入のための NLog のセットアップ
}

لاگنگ

ایم وی سی پروجیکٹوں کے HomeComtroller لئے، ریزر صفحات کے لئے، IndexModel آپ کو ILogger<IndexModel> logger کنسٹرکٹر کو منتقل کر دیا جاتا۔ یہ نجی شعبے میں بھی سیٹ _logger ہے، تاکہ آپ اسے لاگ کرنے کے لئے استعمال کر سکیں۔

مندرجہ ذیل ایک ریزر صفحے سے پیداوار کی ایک مثال ہے, لیکن ایم وی سی ایک ہی کوڈ کے ساتھ آؤٹ پٹ کر سکتے ہیں.

// 省略

public class IndexModel : PageModel
{
  private readonly ILogger<IndexModel> _logger;
  
  public IndexModel(ILogger<IndexModel> logger)
  {
    _logger = logger;
    
    _logger.LogTrace("Trace で出力します。");
    _logger.LogDebug("Debug で出力します。");
    _logger.LogInformation("Information で出力します。");
    _logger.LogWarning("Warning で出力します。");
    _logger.LogError("Error で出力します。");
    _logger.LogCritical("Critical で出力します。");
    
    _logger.LogInformation(1, "EventID ありで出力します。");
  }
  
  public void OnGet()
  {
    _logger.LogInformation("ページを表示するタイミングでログを出力します。");
  }
}

ڈی بگنگ کرتے وقت، میں سمجھتا ہوں کہ پروجیکٹ کے فولڈر میں لاگ فائل بنائی جا سکتی ہے۔

آپ مسل کے مشمولات دیکھ کر لاگ چیک کر سکتے ہیں۔

نمونہ نلوگ.کنفیگ تبصرہ

میں اسے ترتیب سے سمجھا رہا ہوں، لیکن میں کم اہم حصوں کی وضاحت نہیں کر رہا ہوں۔

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      throwConfigExceptions="true"
      internalLogFile="${basedir}/internal-nlog-AspNetCore.txt">

پیرامیٹرز ہیں، جیسے کہ خود این لاگ کے لیے لاگ آؤٹ پٹ سیٹنگیں۔

internalLogFile لاگ کی منزل ہوگی۔ مثال کے طور پر، اگر لاگ کے آؤٹ پٹ میں ہی کوئی نقص ہے تو یہ مددگار ثابت ہوسکتا ہے۔ ${basedir} پروگرام کے عمل درآمد پوشہ سے مراد ہے۔

internalLogLevel این لاگ لاگ کی آؤٹ پٹ سطح ہے۔ Off اگر ایسا ہے تو یہ بالکل بھی پیداوار نہیں ہوگی۔

<!-- ログの出力レイアウトを変数 layoutDefine で定義 -->
<variable name="layoutDefine"
          value="${longdate} [${event-properties:item=EventId_Id:whenEmpty=0}][${level:padding=-5}] ${message} ${exception:format=tostring} (${callsite:includeNamespace=false:fileName=true:includeSourcePath=false})" />

متغیر اس بات پر سیٹ ہے کہ لاگ کے مشمولات کس لے آؤٹ میں ہوں گے۔ آپ براہ راست بعد کے اہداف میں ٹائپ کر سکتے ہیں، لیکن اگر آپ ایک ہی لے آؤٹ کے متعدد کا اختصاص کرتے ہیں، تو ان کا انتظام ایک متغیر میں کرنا آسان ہے۔

بہتر ہے کہ سرکاری ویب سائٹ کا حوالہ دیا جائے تاکہ یہ دیکھا جا سکے کہ لے آؤٹ میں کون سے پیرامیٹرز کی تخصیص کی جا سکتی ہے۔

حوالہ کے لیے، یہاں متعین کردہ پیرامیٹردرج ذیل وضع میں آؤٹ پٹ ہیں:

پیرامیٹر آؤٹ پٹ مشمول
مبہم تاریخ اور وقت کے منٹ جیسے "2021-03-17 11:46:36.5034"
واقعہ خواص پروگرام کے ذریعہ متعین کردہ لاگ آؤٹ پٹ کی تقریب شناختی کار، وغیرہ دکھاتا ہے
سطح سطحیں جیسے سراغ اور نقص
پیغام پروگرام لاگنگ میں اختصاصی پیغام
استثنا اگر آپ پروگرام لاگنگ میں استثنیٰ پاس کرتے ہیں تو کیا ہوگا
کال سائٹ لاگنگ محل وقوع، نام مسل وغیرہ

آؤٹ پٹ مثال

2021-03-17 11:46:37.3537 [0][Info ] ページを表示するタイミングでログを出力します。  (IndexModel.OnGet(Index.cshtml.cs:26))
<!-- 書き込むターゲット -->
<targets>
  <!-- Visual Studio の出力 (デバッグ) に書き込みます -->
  <target xsi:type="Trace" name="TraceOutput" rawWrite="true" layout="${layoutDefine}" />

  <!-- 基本的な詳細を含むすべてのログメッセージのファイルターゲット -->
  <target xsi:type="File" name="FileOutput" fileName="${aspnet-appbasepath}/Log-${shortdate}.log" layout="${layoutDefine}" />

  <!-- Docker / Visual Studio の起動検出を改善するためにライフタイムメッセージをホストするためのコンソールターゲット  -->
  <target xsi:type="Console" name="LifetimeConsole" layout="${level:truncate=4}\: ${logger}[0]${newline}      ${message}${exception:format=tostring}" />
</targets>

پیداوار کے ہدف کی وضاحت کرتا ہے۔ متعدد کی تخصیص کی جا سکتی ہے۔

پہلی xsi:type="Trace" وضاحت، اور لاگ ویژیول سٹوڈیو آؤٹ پٹ ونڈو میں چھاپا جاتا ہے. اسے بنیادی طور پر عمل درآمد کو ختم کرنے کے لئے استعمال کیا جاسکتا ہے۔

دوسرا xsi:type="File" اختصاصی راستے میں مسل کی تخصیص اور لاگ کرتا ہے۔ اگر آپ ${shortdate} راہ میں اختصاص کرتے ہیں، تو لاگ کے وقت لاگ کی تاریخ کی فائل پر لاگ لکھ سکتے ہیں۔ ویب پروجیکٹ کے لیے جڑ پوشہ کی وضاحت بھی کرتا ${aspnet-appbasepath} ہے۔ تاہم، آپریٹنگ کرتے وقت، پروگرام کی تبدیلی اور سلامتی کے لئے ویب ڈائریکٹری سے باہر لاگ فائلوں کو آؤٹ پٹ کرنا بہتر ہے۔

تیسرا xsi:type="Console" اختصاص کیا گیا ہے اور کنسول ایپ میں کنسول میں دکھایا جا سکتا ہے۔ ASP.NET کور بذات خود کنسول ایپ نہیں ہے، لیکن اسے ڈوکر اور ایجور جیسے ماحول میں بھی استعمال کیا جاسکتا ہے کیونکہ ریاست کو کنسول میں دکھایا جاسکتا ہے۔ یہ این لاگ آفیشل ویب سائٹ پر بیان ہے۔

<!-- ロガー名からターゲットにマップするルール -->
<rules>
  <!-- Microsoft からのものを含むすべてのログ -->
  <logger name="*" writeTo="TraceOutput" />

  <!-- 起動の検出を高速化するために、ホスティングライフタイムメッセージをコンソールターゲットに出力します。Microsoft.Hosting.Lifetime はここより下の定義には出力しません -->
  <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="LifetimeConsole" final="true" />

  <!-- 重要でない Microsoft ログをスキップして、自分のログのみをログに記録する。システムが出す Warning 以上のログ以外はここより下の定義には出力されません -->
  <logger name="Microsoft.*" maxlevel="Info" final="true" />
  <logger name="System.Net.Http.*" maxlevel="Info" final="true" />

  <!-- 上記で除外したもの以外をファイルに出力 -->
  <logger name="*" writeTo="FileOutput" />
</rules>

یہاں آپ واضح کرتے ہیں کہ کس سطح اور کس قسم کے لاگ آؤٹ پٹ سے کہاں ہیں۔ یہ تصریح اوپر سے اوپر تک لگائی جاتی ہے۔

پہلا ہدف پر name="*" تمام لاگ آؤٹ پٹ کرنا ہے کیونکہ writeTo اختصاص کرتے وقت سطح کی تخصیص کی گئی ہے۔ یہ target اختصاصی میں ہے، لہذا یہ TraceOutput ویژیول سٹوڈیو آؤٹ پٹ میں ظاہر ہوتا ہے۔

دوسرا لائبریری Microsoft.Hosting.Lifetime میں لاگ آؤٹ پٹ کے لئے آؤٹ پٹ writeTo (コンソール) ہے۔ کنسول لائف ٹائم ایسوسی ایشنوں کو ایجور اور ڈوکر جیسے کنسول ز میں چیک کیا جاسکتا ہے۔ کیونکہ یہ minlevel="Info" واضح کرتا ہے ، اور Trace Debug لاگ نہیں ہے۔ اس کے علاوہ، بعد کی تعریفیں متعلقہ لاگ آؤٹ پٹ نہیں final="true" Microsoft.Hosting.Lifetime کرتی ہیں۔

تیسرا یہ ہے کہ لاگ اور لاگ کی name="Microsoft.*" name="System.Net.Http.*" تخصیص کرکے لاگنگ بند final="true" کی جائے۔ name *ایک وائلڈ کارڈ ہے، جس کا مطلب ہے کہ اس سے Microsoft System.Net.Http مراد تمام متعلقہ لائبریریاں ہیں۔ لیکن یہاں رک جاؤ maxlevel="Info" Trace Debug Information کیونکہ WArningلاگ بھی بعد کی Error تعریفوں میں آؤٹ پٹ Critical ہے۔

چوتھا اوپر روکے گئے لاگ کے علاوہ کسی اور فائل میں آؤٹ پٹ final="true" ہے۔

آرکائیو لاگ

پرانی لاگ فائل کو ایک الگ پوشہ میں محفوظ کرنے کا طریقہ بھی ہے ہر تاریخ کے لیے صرف ایک اہم لاگ فائل کے ساتھ۔

مثال کے طور پر:

<target xsi:type="File"
        name="FileOutput"
        fileName="${aspnet-appbasepath}/Log.log"
        archiveNumbering="Date"
        archiveEvery="Day"
        archiveFileName="${aspnet-appbasepath}/Archive/Log_{#}.log"
        archiveDateFormat="yyyy-MM-dd"
        maxArchiveFiles="7"
        layout="${layoutDefine}" />

یہاں استعمال ہونے والے پیرامیٹرز کا مطلب ہے:

پیرامیٹر تصریح
آرکائیو نمبرنگ تاریخ تاریخ کے مطابق آرکائیو فائل بناتا ہے۔
آرکائیو ہر دن روزانہ کی بنیاد پر آرکائیو کرنے کے لئے استعمال کیا جاتا ہے۔ اس کے علاوہ "مہینہ"، "گھنٹہ"، "اتوار" وغیرہ کی تخصیص کے طریقے بھی ہیں۔
نام محفوظہ مسل آرکائیو کرنے کا راستہ {#} آرکائیو بلحاظ آرکائیو کی بنیاد پر تبدیلیاں۔
آرکائیو تاریخ وضع نام مسل کی تاریخ بتاریخ آرکائیو تاریخ وضع۔
میکس آرکائیو فائلیں اس بات کی وضاحت کرتا ہے کہ کتنی فائلوں کو آرکائیو کرنا ہے۔

غیر تاریخ کے طریقوں کو محفوظ کرنے کے طریقے بھی ہیں۔ مزید معلومات کے لیے آفیشل ویب سائٹ دیکھیں۔

جب اسے پھانسی دی جاتی ہے تو ایسا لگتا ہے:

فی لاگ ای میل بھیجیں

این لاگ آپ کو لاگ کرتے وقت ای میلز بھیجنے کی بھی اجازت دیتا ہے۔ تاہم، اگر آپ ڈی بگ لاگ جیسی ای میل بھیجتے ہیں، تو یہ بھیجنے کے لئے بہت زیادہ ہو جائے گا، صرف محدود لاگ لیول کو نشانہ بنانا ایک اچھا خیال ہے، جیسے نقص اور مہلک۔ اس کے علاوہ ناکامی کے خطرے سے بچنے کے لیے، جیسے اوورز کی ترسیل کی وجہ سے ڈاک سرور کو بلاک کرنا، ہم سفارش کرتے ہیں کہ آپ صرف لاگ-ای میل اکاؤنٹ کا اختصاص کریں۔

مندرجہ ذیل ایک تشکیل کی مثال ہے۔ اگر آپ اصل میں ڈاک بھیجنا چاہتے ہیں تو اس MTP پیش کار پر عمل کریں جسے آپ استعمال کرنا چاہتے ہیں۔

<targets>
  <target xsi:type="Mail"
          name="SendMail"
          smtpServer="SMTP Server Name"
          smtpPort="25"
          subject="XXXX システムでエラーが発生しました"
          from="aaaa@example.com"
          to="bbbb@example.com"
          enableSsl="False"
          smtpAuthentication="None"
          smtpUserName=""
          smtpPassword=""
          layout="${layoutDefine}"/>
</targets>

<rules>
  <logger name="*" minlevel="Error" writeTo="SendMail" />
</rules>

کوائفیہ میں لاگ لکھیں

این لاگ ڈیٹا بیس پر لاگ بھی لکھ سکتا ہے۔ مندرجہ ذیل ایک مثال ہے، لہذا براہ کرم تفصیلات کے لئے سرکاری ویب سائٹ کا حوالہ دیں۔

یہ سیکشن مختلف سرور پر ایس کیو ایل سرور کو لکھنے کے مراحل بیان کرتا ہے۔

سب سے پہلے، ہدف ایس کیو ایل سرور میں لاگ ان کرنے کے لیے ایک جدول بنائیں۔ چونکہ آپ لکھنے کے لیے قدر کا انتخاب کر سکتے ہیں، اس لیے اس بات کی وضاحت کریں کہ آپ کو کالم کے طور پر لاگ کے طور پر کیا درکار ہے۔

درج ذیل جدول تخلیق ایس کیو ایل کی ایک مثال ہے۔

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Log](
  [Id] [int] IDENTITY(1,1) NOT NULL,
  [Application] [nvarchar](50) NOT NULL,
  [Logged] [datetime] NOT NULL,
  [Level] [nvarchar](50) NOT NULL,
  [User] [nvarchar](250) NOT NULL,
  [Message] [nvarchar](max) NOT NULL,
  [Logger] [nvarchar](250) NULL,
  [Callsite] [nvarchar](max) NULL,
  [Exception] [nvarchar](max) NULL,
  CONSTRAINT [PK_dbo.Log] 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

ڈیٹا بیس پروسیسنگ کے لیے ڈیٹا بیس کلائنٹ لائبریری System.Data.SqlClient درکار ہے۔ آئیے اسے نیو گیٹ سے انسٹال کرتے ہیں۔

ایپسیٹنگز.جے ایس این کو ڈیٹا بیس معلومات لکھتا ہے۔ این لاگ ڈاٹ کنفیگ آپ کو ایپسیٹنگز ڈاٹ جے سن میں معلومات لوڈ کرنے کی اجازت دیتا ہے۔ سیٹنگیں عارضی ہیں، لہذا براہ کرم انہیں اصل ڈیٹا بیس کے مطابق سیٹ کریں۔ کلیدی نام من مانی ہے، لیکن این ایل او جی ڈاٹ کنفیگ کے ذریعہ استعمال کیا جاتا ہے۔

{
  "": "省略",

  "NlogConnection": {
    "DbHost": "ServerName\\SQLEXPRESS",
    "Database": "TestDatabase",
    "User": "UserName",
    "Password": "********"
  }
}

نلوگ ڈاٹ کنفیگ درج ذیل سیٹ کریں:

<targets>
  <target xsi:type="Database"
          name="DatabaseOutput"
          dbProvider="sqlserver"
          dbHost="${configsetting:name=NlogConnection.DbHost}"
          dbDatabase="${configsetting:name=NlogConnection.Database}"
          dbUserName="${configsetting:name=NlogConnection.User}"
          dbPassword="${configsetting:name=NlogConnection.Password}">
    <commandText>
      insert into dbo.Log (
        Application, Logged, [Level], [User], Message, Logger, CallSite, Exception
      ) values (
        @Application, @Logged, @Level, @User, @Message, @Logger, @Callsite, @Exception
      );
    </commandText>
    <parameter name="@application" layout="XXXX System" />
    <parameter name="@logged" layout="${date}" />
    <parameter name="@level" layout="${level}" />
    <parameter name="@user" layout="${aspnet-user-identity}" />
    <parameter name="@message" layout="${message}" />
    <parameter name="@logger" layout="${logger}" />
    <parameter name="@callSite" layout="${callsite:filename=true}" />
    <parameter name="@exception" layout="${exception:tostring}" />
  </target>
</targets>

<rules>
  <logger name="*" writeTo="DatabaseOutput" />
</rules>

اگر چلانے میں کوئی نقائص نہیں ہیں تو اسے درج ذیل لکھا جائے گا:

ویسے.cs نوٹ کریں کہ ابتدائی مرحلے میں ڈیٹا بیس پر لاگ لکھنے کی کوشش، جیسے پروگرام .cs طریقوں سے CreateHostBuilder پہلے، ناکام ہوسکتی ہے۔

درخواست خدمات سے لاگر حاصل کریں اور انہیں لاگ کریں

جب بھی آپ نیا کنٹرولر یا صفحہ ماڈل بناتے ہیں تو کنسٹرکٹر میں اضافہ کرنا تھکادینے والا ہوسکتا ILogger ہے۔ متبادل طور پر، RequestServices آپ سے حاصل کر سکتے ہیں.

public void OnGet()
{
  // RequestServices から ILogger を取得する
  var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));

  logger.LogInformation("ページを表示するタイミングでログを出力します。");
}

اگر اپنے کنٹرولر یا صفحہ ماڈل کی تخصیص کرنا بھی بوجھل ہے، تو آپ توسیع کے طریقے یا بنیادی کلاسیں بنا سکتے ہیں۔

public static class AspNetExtention
{
  /// <summary>
  /// ロガーを取得する拡張メソッドです。
  /// </summary>
  public static ILogger<T> GetLogger<T>(this T self) where T : PageModel
    => (ILogger<T>)self.HttpContext.RequestServices.GetService(typeof(ILogger<T>));

  // MVC の場合
  //public static ILogger<T> GetLogger<T>(this T self) where T : Controller
  //  => (ILogger<T>)self.HttpContext.RequestServices.GetService(typeof(ILogger<T>));
}

معاملات استعمال کریں

public void OnGet()
{
  // RequestServices から ILogger を取得する (this. は必要)
  var logger = this.GetLogger();

  logger.LogInformation("ページを表示するタイミングでログを出力します。");
}