Sử dụng bản ghi NLog

Ngày tạo trang :

môi trường

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 5.0 (MVC, Trang Razor)

Bắt đầu

NLog bây giờ có thể xuất các bản ghi vào các tập tin, e-mail, và cơ sở dữ liệu dựa trên các thiết lập.

NLog ASP.NET hệ thống ghi nhật ký tiêu chuẩn cốt lõi. Khi sử dụng trình ghi mặc định, bạn có thể đặt nhật ký đầu ra dựa trên cài đặt.

Giới thiệu về mức độ đăng nhập

Cả Microsoft Log và NLog đều được chia thành sáu giai đoạn với mức đầu ra về cơ bản nhất quán:

Cấp độ MicrosoftNLog
0 Trace Trace
1 Debug Debug
2 Information Info
3 Warning Warn
4 Error Error
5 Critical Fatal
(6) (None) (Off)

Mức độ càng cao, nhật ký càng quan trọng, khả năng ghi nhật ký càng cao bất kể giới hạn đầu ra nhật ký.

Quá trình ghi nhật ký

Giới thiệu gói NLog

ASP.NET dự án cốt lõi, thêm gói.

Bấm chuột phải vào phụ thuộc của dự án, rồi chọn Quản lý gói NuGet.

Nhấp vào tab Duyệt, sau đó nhập NLog vào trường tìm kiếm để xem các gói liên quan đến NLog.

Chọn NLog và nhấp vào nút Cài đặt để chọn phiên bản ổn định mới nhất.

Bấm OK.

NLog.Web.AspNetCore cũng được cài đặt

Gói đã được thêm vào dự án.

Thêm nlog.config

Thêm nlog.config vào dự án, đây là định nghĩa đầu ra của nhật ký NLog. Bởi vì nội dung ở định dạng XML, tôi tạo nó như là một tập tin XML. Tên tệp phải là nlog.config (chữ thường).

Tạo như sau trong tệp: Cài đặt chi tiết sẽ được mô tả sau.

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

Đảm bảo rằng thuộc tính nlog.config được đặt thành Hành động xây dựng: Nội dung và Sao chép vào thư mục đầu ra: Sao chép (nếu mới).

Chỉnh sửa appsetting.json

Theo mặc định, làm thế nào để thiết lập nlog.config Information chỉ đầu ra các cấp độ. Điều này là do ghi nhật ký cũng phụ thuộc vào appsetting.json.

Mở appsetting.json và thay Logging.LogLevel.Default đổi Trace giá trị thành . Nếu bạn sử dụng NLog, bạn có thể xuất tất cả các cấp thực tế bằng cách thiết lập appsetting.json vì điều Trace chỉnh mức được thực hiện ở phía NLog.

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

Ngoài ra, nó được phát triển cho appsettings. Cài đặt của Development.json sẽ tải, vì vậy chúng tôi sẽ thay đổi nó theo cùng một cách.

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

Chuẩn bị chương trình NLog

Thêm chương trình để cơ chế NLog có thể ghi nhật ký.

Mở tệp .cs chương trình và sửa nó như sau:

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 のセットアップ
}

Đầu ra nhật ký

Đối với dự án HomeComtroller MVC, tôi nghĩ rằng các nhà xây dựng của trang Razor IndexModel đã ILogger<IndexModel> logger được thông qua. Nó cũng được thiết lập _logger để có một lĩnh vực tư nhân, do đó, bạn có thể sử dụng nó để ghi lại các bản ghi

Dưới đây là ví dụ về đầu ra của trang Razor, nhưng MVC có thể sử dụng cùng một mã để đầu ra.

// 省略

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

Khi bạn chạy gỡ lỗi, các tập tin đăng nhập có thể nằm trong thư mục của dự án.

Bạn có thể xem nhật ký bằng cách xem nội dung của tệp.

Mô tả của ví dụ nlog.config

Tôi giải thích theo thứ tự, nhưng bỏ qua các phần ít quan trọng hơn.

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

Có các thông số như cài đặt đầu ra nhật ký của NLog.

internalLogFile Nhật ký được in vào nhật ký. Ví dụ, nó rất hữu ích nếu có một lỗi trong đầu ra đăng nhập chính nó. ${basedir} Trỏ đến cặp thực hiện của chương trình.

internalLogLevel là mức đầu ra của nhật ký NLog. Off Không có gì được in.

<!-- ログの出力レイアウトを変数 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})" />

Đặt nội dung nhật ký thành một biến để xuất nội dung của nhật ký trong bố cục nào. Bạn có thể nhập nó trực tiếp vào các mục tiêu trong tương lai, nhưng nếu bạn muốn chỉ định nhiều bố cục giống hệt nhau, bạn nên đặt biến trong một biến.

Tốt nhất là kiểm tra trang web chính thức để biết các thông số mà bố cục có thể có.

Các tham số được cung cấp ở đây được xuất ra ở định dạng sau để tham khảo:

Tham số Đầu ra nội dung
longdate Ngày/phút/giây, chẳng hạn như "2021-03-17 11:46:36.5034"
event-properties Hiển thị ID sự kiện được ghi nhật ký do chương trình chỉ định, v.v.
level cấp độ như "Trace" và "Error"
message Thư được chỉ định trong ghi nhật ký chương trình
exception Nội dung khi exception được thông qua trong đầu ra nhật ký của chương trình
callsite Vị trí đầu ra nhật ký, tên tệp, v.v

Ví dụ về đầu ra

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>

Mục tiêu để đầu ra. Có thể có nhiều hơn một.

Đầu tiên xsi:type="Trace" được chỉ định rằng các bản ghi được in vào cửa sổ đầu ra Visual Studio. Nó chủ yếu được sử dụng để kiểm tra trong chạy gỡ lỗi.

Chỉ định thứ xsi:type="File" hai và được ghi lại vào tệp cho đường dẫn được chỉ định. Khi ${shortdate} được chỉ định trong đường dẫn, bạn có thể ghi nhật ký vào tệp ngày ghi nhật ký. Ngoài ${aspnet-appbasepath} ra, chỉ định thư mục gốc của dự án Web. Tuy nhiên, khi làm việc, tốt nhất là in tệp nhật ký ra khỏi thư mục Web để xem xét trao đổi chương trình và bảo mật.

Chỉ định thứ ba và có xsi:type="Console" thể được hiển thị trong bảng điều khiển trong ứng dụng bảng điều khiển. ASP.NET Core không phải là một ứng dụng giao diện điều khiển, nhưng bạn có thể hiển thị trạng thái trong bảng điều khiển trong một môi trường như Docker hoặc Azure và có thể được sử dụng cho mục đích này. Chúng tôi sử dụng mô tả trên trang web chính thức của 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>

Ở đây bạn có thể chỉ định mức độ và loại nhật ký để in. Mô tả này được áp dụng theo thứ tự từ trên xuống dưới.

Đầu tiên được name="*" chỉ định, nhưng mức độ không được chỉ định, do đó, writeTo tất cả các bản ghi được in vào mục tiêu. Bởi target vì bạn TraceOutput chỉ định ở đây trong tạo ra, nó được hiển thị trong đầu ra Visual Studio.

Đầu ra Microsoft.Hosting.Lifetime thứ hai là nhật ký đầu ra vào thư writeTo (コンソール) viện. Bạn có thể xem mối quan hệ ConsoleLifetime trong bảng điều khiển như Azure và Docker. minlevel="Info" Hoặc không Trace được Debug ghi lại bởi vì nó chỉ định . Ngoài final="true" ra, bởi vì nó được chỉ định, định Microsoft.Hosting.Lifetime nghĩa tiếp theo không in các bản ghi có liên quan.

Ghi nhật name="Microsoft.*" ký dừng thứ ba, name="System.Net.Http.*" được chỉ định final="true" cho nhật ký của và. name "*" trong là ký tự đại diện, có Microsoft System.Net.Http nghĩa là trỏ đến tất cả các thư viện liên quan. maxlevel="Info" Bởi Trace Debug vì, Information dừng lại ở đây, nhưng WArningNhật Error Critical ký của , và cũng được in trong các định nghĩa tiếp theo.

Tệp đầu ra thứ tư thay final="true" vì nhật ký dừng ở trên.

Lưu trữ các bản ghi

Một cách tiếp cận khác là lưu trữ chỉ có một tệp nhật ký chính vào một thư mục khác, mỗi ngày có một tệp nhật ký cũ.

Ví dụ:

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

Các tham số được sử dụng ở đây có ý nghĩa sau:

Mô tả tham số
archiveNumbering Nếu ngày được chỉ định, tệp lưu trữ được tạo theo ngày.
archiveEvery Nếu ngày được chỉ định, nó được lưu trữ theo ngày. Các phương pháp được chỉ định khác bao gồm Tháng, Hour và Sunday.
archiveFileName Đường dẫn để lưu trữ. Vị trí của {#} thay đổi theo đơn vị lưu trữ.
archiveDateFormat Định dạng ngày trong năm cho tên tệp được lưu trữ theo ngày.
maxArchiveFiles Chỉ định có bao nhiêu tệp được lưu trữ.

Ngoài ngày tháng, bạn có thể lưu trữ chúng theo những cách khác. Để biết thêm thông tin, hãy xem trang web chính

Khi bạn chạy nó, nó trông như thế này:

Gửi email theo nhật ký

NLog cũng cho phép bạn gửi email trong khi ghi nhật ký. Tuy nhiên, nếu bạn gửi thư như nhật ký gỡ lỗi, số lượng gửi sẽ quá lớn. Tốt nhất là chỉ nhắm mục tiêu các mức nhật ký hạn chế, chẳng hạn như lỗi và mức độ nghiêm trọng. Ngoài ra, để tránh nguy cơ thất bại như chặn máy chủ thư do gửi quá mức, Chúng tôi khuyên bạn chỉ định tài khoản email dành riêng cho nhật ký.

Dưới đây là một ví dụ về cài đặt. Nếu bạn đang thực sự gửi thư, thiết lập dựa trên máy chủ SMTP bạn muốn sử dụng.

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

Ghi nhật ký vào cơ sở dữ liệu

NLog cũng cho phép bạn ghi nhật ký vào cơ sở dữ liệu. Dưới đây là một ví dụ, xem trang web chính thức để biết thêm thông tin.

Phần này cung cấp hướng dẫn từng bước để viết SQL Server trên một máy chủ khác.

Đầu tiên, tạo ra một bảng để ghi nhật ký trên sql server mục tiêu. Bởi vì bạn có thể chọn để viết giá trị, các giá trị cần thiết cho các bản ghi được định nghĩa là cột.

Dưới đây là một ví dụ về SQL tạo ra một bảng.

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

Xử lý cơ sở dữ liệu yêu System.Data.SqlClient cầu thư viện khách hàng cơ sở dữ liệu Hãy cài đặt nó từ NuGet.

Ghi thông tin cơ sở dữ liệu vào appsettings.json. nlog.config có thể đọc thông tin trong appsettings.json. Cài đặt là tạm thời, vì vậy hãy thiết lập nó dựa trên cơ sở dữ liệu thực tế. Tên khóa là tùy chọn, nhưng được sử dụng khi được chỉ định trong nlog.config.

{
  "": "省略",

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

nlog.config được thiết lập như sau:

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

Nếu không có lỗi, viết như sau.

Lưu ý rằng .cs có thể thất bại nếu bạn cố gắng ghi nhật ký vào cơ sở dữ liệu, chẳng hạn .cs phương pháp sản CreateHostBuilder xuất.

Lấy acout từ RequestServices và ghi lại các bản ghi

Thêm vào nhà xây dựng có thể là một rắc rối mỗi khi bạn ILogger tạo một bộ điều khiển mới hoặc mô hình trang. Một cách khác là RequestServices lấy nó từ nó.

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

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

Nếu bạn gặp rắc rối khi chỉ định bộ điều khiển hoặc mô hình trang của riêng mình, bạn có thể tạo phương thức mở rộng hoặc tạo lớp cơ sở.

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>));
}

Sử dụng ví dụ

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

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