ใช้ระเบียน NLog

วันที่สร้างเพจ :

สิ่งแวดล้อม

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 5.0 (MVC, หน้า Razor)

เริ่มต้นใช้งาน

ขณะนี้ NLog สามารถส่งออกบันทึกไปยังไฟล์ อีเมล และฐานข้อมูลตามการตั้งค่าได้แล้ว

NLog ASP.NET ระบบการบันทึกมาตรฐานหลัก เมื่อคุณใช้ตัวบันทึกเริ่มต้น คุณสามารถส่งออกแฟ้มบันทึกตามการตั้งค่า

เกี่ยวกับระดับสมุดรายวัน

ทั้งบันทึกของ Microsoft และ NLog แบ่งออกเป็นหกขั้นตอนและระดับเอาต์พุตจะสอดคล้องกันโดยทั่วไป:

ระดับ Microsoft NLog
0 Trace Trace
1 Debug Debug
2 Information Info
3 Warning Warn
4 Error Error
5 Critical Fatal
(6) (None) (Off)

ยิ่งระดับสูงเท่าใด บันทึกก็จะยิ่งมีความสําคัญมากขึ้นเท่านั้น

กระบวนการบันทึก

แนะนําแพคเกจ NLog

ASP.NET เพิ่มแพคเกจหลังจากที่คุณได้เลือกโครงการหลักแล้ว

คลิกขวาที่การขึ้นต่อกันของรายการ แล้วเลือก จัดการแพคเกจ NuGet

คลิกแท็บ เรียกดู แล้วป้อน NLog ในฟิลด์การค้นหาเพื่อดูแพคเกจที่เกี่ยวข้องกับ NLog

เลือก NLog และคลิกปุ่มติดตั้งเพื่อเลือกรุ่นเสถียรล่าสุด

คลิก ตกลง

นอกจากนี้ ติดตั้ง NLog.Web.AspNetCore

มีการเพิ่มแพคเกจลงในโครงการแล้ว

เพิ่ม nlog.config

เพิ่ม nlog.config ลงในโครงการซึ่งเป็นข้อกําหนดเอาต์พุต ของบันทึก NLog เนื่องจากเนื้อหาอยู่ในรูปแบบ XML ฉันจึงสร้างเนื้อหานั้นเป็นแฟ้ม XML ชื่อแฟ้มต้อง เป็น 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 ถูกตั้งค่าเป็นสร้างการดําเนินการ: เนื้อหา และคัดลอกไปยังไดเรกทอรีผลลัพธ์: คัดลอก (ถ้าใหม่)

แก้ไข appsetting.json

โดยค่าเริ่มต้น วิธีการตั้งค่า nlog.config Information เพื่อส่งออกเฉพาะระดับเหล่านี้ ทั้งนี้เนื่องจากการบันทึกยังขึ้นอยู่กับ appsetting.json

เปิด appsetting.json Logging.LogLevel.Default Trace เปลี่ยนค่าเป็น ถ้าคุณใช้ NLog คุณสามารถส่งออกระดับจริงทั้งหมดโดยการตั้งค่า appsetting.json Trace เนื่องจากการปรับระดับจะดําเนินการที่ด้าน NLog

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

นอกจากนี้การพัฒนาเป็น appsettings การตั้งค่าของ 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 のセットアップ
}

เอาต์พุตบันทึก

สําหรับโครงการ MVC HomeComtroller ผมคิดว่าคอนสตรั IndexModelILogger<IndexModel> logger เตอร์ของหน้า Razor ได้รับการส่งผ่านไปยัง นอกจากนี้ยังตั้งค่า _logger เป็นฟิลด์ส่วนตัวเพื่อให้คุณสามารถใช้เพื่อบันทึกบันทึกได้

นี่คือตัวอย่างของผลลัพธ์ของหน้า Razor แต่ MVC สามารถส่งออกด้วยรหัสเดียวกัน

// 省略

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

มีพารามิเตอร์เช่นการตั้งค่าเอาต์พุตบันทึกของ NLog เอง

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})" />

ตั้งค่าเนื้อหาของแฟ้มบันทึกเป็นตัวแปรเพื่อส่งออกเนื้อหาของแฟ้มบันทึกในรูปแบบใด คุณสามารถป้อนได้โดยตรงในเป้าหมายในอนาคต แต่ถ้าคุณต้องการระบุเค้าโครงเดียวกันมากกว่าหนึ่งเค้าโครง คุณควรวางตัวแปรในตัวแปรเดียว

คุณควรตรวจสอบเว็บไซต์ อย่างเป็นทางการเพื่อดูว่าพารามิเตอร์ ใดที่เค้าโครงสามารถมีได้

พารามิเตอร์ที่ให้ไว้ที่นี่จะแสดงผลในรูปแบบต่อไปนี้สําหรับการอ้างอิง:

เนื้อหา
พารามิเตอร์ออก
longdate วัน/เวลา นาที/วินาที เช่น "2021-03-17 11:46:36.5034"
event-properties แสดงรหัสเหตุการณ์สําหรับการบันทึกที่ระบุโดยโปรแกรม และอื่นๆ
level ระดับเช่น "Trace" และ "Error"
message ข้อความที่ระบุในการบันทึกโปรแกรม
exception เนื้อหาเมื่อ Exception ถูกส่งผ่านในเอาต์พุตบันทึกของโปรแกรม
callsite ตําแหน่งเอาต์พุตบันทึก ชื่อไฟล์ และอื่นๆ

ตัวอย่างผลลัพธ์

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" แฟ้มบันทึกถูกพิมพ์ไปยังหน้าต่างผลลัพธ์ Visual Studio ใช้เป็นหลักสําหรับการตรวจสอบในการดีบัก

แฟ้ม xsi:type="File" ที่สองถูกระบุ และบันทึกไปยังเส้นทางที่ระบุ เมื่อ ${shortdate} ระบุในพาธ คุณสามารถเขียนล็อกไปยังไฟล์ที่มีวันที่เมื่อล็อกถูกบันทึก นอกจากนี้ ${aspnet-appbasepath} ระบุโฟลเดอร์รากสําหรับโครงการเว็บ อย่างไรก็ตาม เมื่อดําเนินการ จะเป็นการดีที่สุดที่จะพิมพ์แฟ้มบันทึกออกจากไดเรกทอรีเว็บเพื่อพิจารณาการแลกเปลี่ยนโปรแกรมและความปลอดภัย

ที่สามระบุ xsi:type="Console" และสามารถแสดงในคอนโซลในแอปคอนโซล ASP.NET Core ไม่ใช่แอปคอนโซลในตัวเอง แต่คุณสามารถแสดงสถานะในคอนโซลในสภาพแวดล้อมเช่น Docker หรือ Azure และพร้อมใช้งานเพื่อจุดประสงค์นี้ เราใช้คําอธิบายในเว็บไซต์อย่างเป็นทางการของ 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>

ที่นี่คุณสามารถระบุระดับและชนิดของสมุดรายวันที่จะพิมพ์เมื่อต้องการดูระดับและชนิดของสมุดรายวันที่คุณพิมพ์คุณสามารถคลิกได้มากที่สุด 1000 รายการ คําแนะนํานี้ถูกนําไปใช้ตามลําดับจากบนลงล่าง

แรกระบุ name="*" แต่ไม่ได้ระบุระดับดังนั้นบันทึก writeTo ทั้งหมดจะถูกพิมพ์ไปยังปลายทาง target เนื่องจากคุณ TraceOutput ระบุที่นี่ที่สร้างขึ้นใน จึงปรากฏในผลลัพธ์ Visual Studio

เอาต์พุต Microsoft.Hosting.Lifetime ที่สองคือบันทึกที่ writeTo (コンソール) เอาต์พุตไปยังไลบรารี คุณสามารถดูความสัมพันธ์ ConsoleLifetime ในคอนโซล เช่น Azure และ Docker 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}" />

พารามิเตอร์ที่ใช้ที่นี่มีความหมายดังต่อไปนี้:

คําอธิบาย พารามิเตอร์
archiveNumbering ถ้ามีการระบุวันที่ จะมีการสร้างไฟล์เก็บถาวรตามวันที่
archiveEvery ถ้ามีการระบุ วัน ให้เก็บถาวรตามวัน วิธีการระบุอื่น ๆ ได้แก่ เดือน Hour และ Sunday
archiveFileName พาธที่จะเก็บถาวร ตําแหน่งที่ตั้งของ {#} จะเปลี่ยนแปลงในหน่วยเก็บถาวร
archiveDateFormat รูปแบบวันที่ปีสําหรับชื่อแฟ้มที่เก็บถาวรตามวันที่
maxArchiveFiles ระบุจํานวนไฟล์ที่เก็บถาวรได้สูงสุด

นอกจากวันที่แล้ว คุณยังสามารถเก็บถาวรวันที่เหล่านั้นได้ด้วยวิธีอื่น สําหรับ ข้อมูลเพิ่มเติม โปรดดูที่ เว็บไซต์อย่างเป็นทางการ

เมื่อเรียกใช้จะมีลักษณะดังนี้:

ส่งอีเมลตามบันทึก

นอกจากนี้ NLog ยังช่วยให้คุณสามารถส่งอีเมลเมื่อบันทึก อย่างไรก็ตาม ถ้าคุณส่งข้อความเช่นแฟ้มบันทึกการตรวจแก้จุดบกพร่อง เป็นการดีที่สุดที่จะกําหนดเป้าหมายเฉพาะระดับการบันทึกที่จํากัด เช่น ข้อผิดพลาดและระดับมฤตยู นอกจากนี้เพื่อหลีกเลี่ยงความเสี่ยงของความล้มเหลวเช่นการปิดกั้นเซิร์ฟเวอร์อีเมลเนื่องจากการส่งมากเกินไป เราขอแนะนําให้คุณระบุบัญชีอีเมลที่ทุ่มเทให้กับบันทึก

นี่คือตัวอย่างของการตั้งค่า ถ้าคุณต้องการส่งข้อความจริง ให้ตั้งค่าตามเซิร์ฟเวอร์ SMTP ที่คุณต้องการใช้

<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 ยังช่วยให้คุณสามารถเขียนบันทึกไปยังฐานข้อมูลได้ นี่คือตัวอย่างโปรดดู ที่เว็บไซต์อย่างเป็นทางการ สําหรับข้อมูลเพิ่มเติม

ส่วนนี้ให้คําแนะนําทีละขั้นตอนสําหรับการเขียนไปยัง SQL Server บนเซิร์ฟเวอร์อื่น

ขั้นแรก ให้สร้างตารางสําหรับการบันทึกบน SQL Server ปลายทาง เนื่องจากคุณสามารถเลือกที่จะเขียนค่า ได้ ค่าที่จําเป็นสําหรับแฟ้มบันทึกถูกกําหนดเป็นคอลัมน์

ต่อไปนี้เป็นตัวอย่างของ SQL ที่สร้างตาราง

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 Program อาจล้มเหลว

รับคนบันทึกและบันทึกจาก RequestServices

การเพิ่มคอนสตรัคเตอร์ทุกครั้งที่คุณ 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("ページを表示するタイミングでログを出力します。");
}