लॉग इन करने के लिए NLog का उपयोग करें

पेज निर्माण की तारीख :

पर्यावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2019
ASP.NET कोर
  • 5.0 (एमवीसी, रेजर पेज)

पहले

NLog आपको अपनी सेटिंग के आधार पर फ़ाइलों, ईमेल और डेटाबेस में लॉग आउटपुट करने की अनुमति देता है।

एनलॉग ASP.NET कोर के मानक लॉगिंग सिस्टम में शामिल किया जाएगा। डिफ़ॉल्ट लॉगर का उपयोग करते समय सेटिंग्स के अनुसार लॉग आउटपुट करना संभव है।

लॉग स्तर के बारे में

माइक्रोसॉफ्ट लॉग और NLogs छह चरणों में विभाजित हैं, और उत्पादन का स्तर मोटे तौर पर एक ही हैं:

स्तर माइक्रोसॉफ्टNLog
0 ट्रेस ट्रेस
1 डीबग डीबग
2 जानकारी सूचना-विषयक
3 चेतावनी आगाह करना
4 चूक चूक
5 महत्वपूर्ण अनिष्‍टकर
(6) (कोई नहीं) (बंद)

स्तर जितना अधिक होगा, लॉग उतना ही महत्वपूर्ण है, और लॉग आउटपुट की बाधाओं की परवाह किए बिना इसे लिखे जाने की अधिक संभावना है।

लॉगिंग निर्देश

NLog पैकेज तैनाती

ASP.NET आपने एक कोर प्रोजेक्ट बनाया है, तो एक पैकेज जोड़ें।

आपकी परियोजना के लिए सही क्लिक निर्भरता और प्रबंधित NuGet संकुल का चयन करें।

NLog से संबंधित संकुल प्रदर्शित करने के लिए खोज क्षेत्र में ब्राउज़ टैब और टाइप NLog पर क्लिक करें।

NLog का चयन करें, और फिर चयनित नवीनतम स्थिर संस्करण के साथ इंस्टॉल बटन पर क्लिक करें।

ओके पर क्लिक करें।

NLog.Web.AspNetCore भी इंस्टॉल करें।

प्रोजेक्ट में पैकेज जोड़ा गया है।

nlog.config जोड़ें

परियोजना में Nlog.config, NLog लॉग की आउटपुट परिभाषा जोड़ें। सामग्री एक्सएमएल प्रारूप में हैं, इसलिए मैंने इसे एक्सएमएल फ़ाइल के रूप में बनाया। फ़ाइल का नाम 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"
      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>

सुनिश्चित करें कि nlog.config के गुण कार्रवाई का निर्माण करने के लिए सेट कर रहे हैं: सामग्री, आउटपुट निर्देशिका की प्रतिलिपि: कॉपी अगर नया ।

ऐपसेटिंग.जैसन को संपादित करें

डिफ़ॉल्ट रूप से, कोई फर्क नहीं पड़ता कि आप nlog.config कैसे सेट करते Information हैं, केवल ये स्तर आउटपुट हैं। इसका कारण यह है कि लॉगिंग भी appsetting.json पर निर्भर करता है ।

ऐपसेटिंग.जैसन Logging.LogLevel.Default खोलें और मूल्य को बदल Trace दें। यदि आप NLog का उपयोग करते हैं, तो आप NLog पक्ष पर स्तर को समायोजित कर सकते हैं, ताकि आप appsetting.json सेट करके लगभग सभी स्तरों को आउटपुट Trace कर सकें।

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

इसके अलावा, विकास के दौरान, ऐपसेटिंग। Development.json सेटिंग्स भरी हुई हैं, तो हम उन्हें के रूप में अच्छी तरह से बदल रहे हैं.

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

NLog के लिए कार्यक्रम तैयार करना

एक प्रोग्राम जोड़ें ताकि आप NLog तंत्र में लॉग इन कर सकें।

.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.config कमेंट्री

मैं इसे क्रम में समझा रहा हूं, लेकिन मैं कम महत्वपूर्ण भागों की व्याख्या नहीं कर रहा हूं ।

<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 NLog लॉग का आउटपुट स्तर है। 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 कोर ही एक कंसोल ऐप नहीं है, लेकिन इसका उपयोग डॉकर और नीला जैसे वातावरण में भी किया जा सकता है क्योंकि राज्य को कंसोल में प्रदर्शित किया जा सकता है। यह NLog आधिकारिक वेबसाइट पर विवरण है।

<!-- ロガー名からターゲットにマップするルール -->
<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}" />

यहां उपयोग किए जाने वाले मापदंडों का मतलब है:

पैरामीटर विवरण
आर्काइवनंबरिंग तिथि तारीख के अकांम एक संग्रह फ़ाइल बनाता है।
आर्काइव हर दिन का उपयोग दैनिक आधार पर संग्रह करने के लिए किया जाता है। "महीना", "घंटा", "रविवार", आदि निर्दिष्ट करने के तरीके भी हैं।
आर्काइव फाइलेम पथ को संग्रह करने के लिए । {#} आर्काइव-बाय-आर्काइव आधार पर बदलाव।
आर्काइवडेट फॉर्माट फ़ाइल नाम की तारीख-तारीख संग्रह तिथि प्रारूप।
मैक्सआर्टिवफाइल्स निर्दिष्ट करता है कि कितनी फ़ाइलों को संग्रहीत करने के लिए।

गैर-तिथि विधियों को संग्रहीत करने के तरीके भी हैं। अधिक जानकारी के लिए आधिकारिक वेबसाइट देखें।

जब निष्पादित किया जाता है, तो यह इस तरह दिखता है:

लॉग प्रति ईमेल भेजें

NLog आपको लॉगिंग करते समय ईमेल भेजने की भी अनुमति देता है। हालांकि, यदि आप डिबग लॉग जैसे ईमेल भेजते हैं, तो यह भेजने के लिए बहुत अधिक हो जाएगा, त्रुटि और घातक जैसे केवल सीमित लॉग स्तरों को लक्षित करना एक अच्छा विचार है। इसके अलावा, विफलता के जोखिम से बचने के लिए, जैसे ओवर ट्रांसमिशन के कारण मेल सर्वर को अवरुद्ध करना, हमारा सुझाव है कि आप लॉग-केवल ईमेल खाता निर्दिष्ट करें।

निम्नलिखित एक विन्यास का एक उदाहरण है। यदि आप वास्तव में मेल भेजना चाहते हैं, तो उस एसएमटीपी सर्वर का पालन करें जिसे आप उपयोग करना चाहते हैं।

<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>

डेटाबेस के लिए लॉग लिखें

NLog भी डेटाबेस के लिए लॉग लिख सकते हैं। निम्नलिखित एक उदाहरण है, इसलिए कृपया विवरण के लिए आधिकारिक वेबसाइट का उल्लेख करें।

यह अनुभाग एक अलग सर्वर पर एसक्यूएल सर्वर को लिखने के चरणों का वर्णन करता है।

सबसे पहले, लक्ष्य एसक्यूएल सर्वर में लॉग इन करने के लिए एक टेबल बनाएं। चूंकि आप लिखने के लिए मूल्य चुन सकते हैं, इसलिए परिभाषित करें कि आपको कॉलम के रूप में लॉग के रूप में क्या चाहिए।

निम्नलिखित टेबल निर्माण एसक्यूएल का एक उदाहरण है।

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 की आवश्यकता होती है। चलो इसे NuGet से स्थापित करते हैं।

appsettings.json को डेटाबेस जानकारी लिखता है । nlog.config आप appsettings.json में जानकारी लोड करने के लिए अनुमति देता है। सेटिंग्स अनंतिम हैं, इसलिए कृपया उन्हें वास्तविक डेटाबेस के अनुसार सेट करें। मुख्य नाम मनमाना है, लेकिन nlog.config द्वारा प्रयोग किया जाता है।

{
  "": "省略",

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

इस प्रकार के रूप में nlog.config सेट:

<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("ページを表示するタイミングでログを出力します。");
}