Izmantot NLog, lai pieteiktos

Lapas izveides datums :

Vides

Vizuālā studija
  • Visual Studio 2019
ASP.NET kodols
  • 5.0 (MVC, skuvekļa lapa)

Sākumā

NLog ļauj izvadīt žurnālus failos, e-pastos un datu bāzēs atkarībā no iestatījumiem.

NLog ASP.NET tiks iekļauts core standarta reģistrēšanas sistēmā. Izmantojot noklusējuma reģistrētāju, ir iespējams izvadīt žurnālus atbilstoši iestatījumiem.

Par žurnāla līmeņiem

Microsoft žurnāli un NLogs ir sadalīti sešos posmos, un izvades līmeņi ir aptuveni vienādi:

Microsoft NLog līmenis
0 Izsekot Izsekot
1 Atkļūdošanas Atkļūdošanas
2 Informāciju Info
3 Brīdinājums Brīdināt
4 Kļūda Kļūda
5 Kritisko Letālu
(6) (Nav) (Izslēgts)

Jo augstāks līmenis, jo svarīgāks ir žurnāls, un jo lielāka iespēja, ka tas tiks rakstīts neatkarīgi no žurnāla izvades ierobežojumiem.

Reģistrēšanas instrukcijas

NLog pakotnes izvietošana

ASP.NET esat izveidojis pamatprojektu, pievienojiet pakotni.

Ar peles labo pogu noklikšķiniet uz Sava projekta atkarības un atlasiet Pārvaldīt NuGet pakotnes.

Noklikšķiniet uz cilnes Pārlūkot un meklēšanas laukā ierakstiet NLog, lai parādītu ar NLog saistītās pakotnes.

Atlasiet NLog un pēc tam noklikšķiniet uz instalēšanas pogas ar atlasītu jaunāko stabilo versiju.

Noklikšķiniet uz Labi.

Instalējiet arī NLog.Web.AspNetCore.

Pakete ir pievienota projektam.

Pievienot nlog.config

Pievienojiet projektam Nlog.config, NLog žurnāla izvades definīciju. Saturs ir XML formātā, tāpēc es to izveidoju kā XML failu. Faila nosaukumam jābūt nlog.config (mazajiem burtiem).

Izveidojiet failu šādi: Detalizēti iestatījumi tiks apspriesti vēlāk.

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

Pārliecinieties, vai nlog.config rekvizīti ir iestatīti uz Build Action: Content, Copy to Output Directory: Copy if New.

Appsetting.json rediģēšana

Pēc noklusējuma neatkarīgi no tā, kā iestatāt nlog.config, tikai Information šie līmeņi ir izvade. Tas ir tāpēc, ka reģistrēšana ir atkarīga arī no appsetting.json.

Atveriet appsetting.json Logging.LogLevel.Default un mainiet vērtību uz Trace . Ja izmantojat NLog, varat pielāgot līmeni NLog pusē, lai jūs varētu izvadīt praktiski visus līmeņus, Trace iestatot appsetting.json.

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

Arī izstrādes laikā, aplikācijas. Development.json iestatījumi ir ielādēti, tāpēc mēs arī tos mainām.

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

Programmu sagatavošana NLog

Pievienojiet programmu, lai varētu pieteikties NLog mehānismā.

Atveriet .cs failu un izlabojiet to šādi:

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

Reģistrēšanas

MVC projektiem HomeComtroller , Razor lapām, IndexModel jūs būtu nodots ILogger<IndexModel> logger konstruktoram. Tas ir iestatīts _logger arī privātajā laukā, lai to varētu izmantot, lai pieteiktos.

Tālāk ir piemērs izvadei no Razor lapas, bet MVC var izvadīt ar to pašu kodu.

// 省略

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

Atkļūdojot, es domāju, ka projekta mapē var izveidot žurnālfailu.

Jūs varat pārbaudīt žurnālu, apskatot faila saturu.

Komentāra nlog.config paraugs

Es to izskaidroju kārtībā, bet es nepaskaidroju mazāk svarīgās daļas.

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

Ir parametri, piemēram, paša NLog žurnāla izvades iestatījumi.

internalLogFile būs žurnāla galamērķis. Tas var būt noderīgi, piemēram, ja paša žurnāla izvadē ir kļūda. ${basedir} attiecas uz programmas izpildes mapi.

internalLogLevel ir NLog žurnāla izvades līmenis. Off ja tā ir, tā vispār netiks izvadīta.

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

Mainīgais ir iestatīts uz to, kādā izkārtojumā tiks izvadīts žurnāla saturs. Vēlākos mērķos var rakstīt tieši, bet, ja norādāt vairākus no viena izkārtojuma, tos ir vieglāk pārvaldīt vienā mainīgajā.

Labāk ir atsaukties uz oficiālo vietni, lai redzētu, kādus parametrus var norādīt izkārtojumā.

Atsaucei šeit norādītie parametri ir izvade šādā formātā:

Parametru izvades saturs
ilgs laiks Datums un laika minūtes, piemēram, "2021-03-17 11:46:36.5034"
notikuma rekvizīti Parāda programmas norādītā žurnāla izvades notikuma ID utt.
Līmenī Līmeņi , piemēram , izsekošana un kļūdu
Ziņojumu Programmas reģistrēšanā norādītais ziņojums
Izņēmums Ko darīt, ja programmu reģistrēšanā tiek pieļauts izņēmums
izsaukumavieta Reģistrēšanas vieta, faila nosaukums utt.

Izvades piemērs

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>

Norāda izvades mērķi. Var norādīt vairākus.

Pirmais norāda xsi:type="Trace" , un žurnāls tiek drukāts Visual Studio izvades logā. To var izmantot galvenokārt izpildes atkļūdošanai.

Otrais xsi:type="File" norāda un reģistrē failā norādītajā ceļā. Ja ${shortdate} norādāt ceļu, žurnālu žurnāla laikā var ierakstīt žurnāla datuma failā. Norāda ${aspnet-appbasepath} arī Web projekta saknes mapi. Tomēr, darbojoties, labāk ir izvadīt žurnālfailus ārpus Web direktorija programmu aizstāšanai un drošībai.

Trešais ir xsi:type="Console" norādīts, un to var parādīt konsolē konsoles lietotnē. ASP.NET Core pati par sevi nav konsoles lietotne, bet to var izmantot arī tādās vidēs kā Docker un Azure, jo stāvokli var parādīt konsolē. Tas ir apraksts NLog oficiālajā tīmekļa vietnē.

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

Šeit var norādīt, kādā līmenī un kāda tipa žurnālus izvadīt uz vietu. Šis apraksts tiek lietots no augšas uz augšu.

Pirmais ir izvadīt name="*" visus žurnālus mērķī, jo norādīšanas writeTo laikā ir norādīts līmenis . Šī target ir norādītā vērtība programmā , tāpēc tā tiek parādīta Visual Studio TraceOutput izvadē.

Otrais ir Microsoft.Hosting.Lifetime izvade uz bibliotēkas žurnāla writeTo (コンソール) izvadi. ConsoleLifetime asociācijas var pārbaudīt konsolēs, piemēram, Azure un Docker. minlevel="Info" , jo Trace Debug tas norāda un nav reģistrēts žurnālā. Arī turpmākās definīcijas neizvada final="true" Microsoft.Hosting.Lifetime saistītos žurnālus.

Trešais ir name="Microsoft.*" pārtraukt name="System.Net.Http.*" reģistrēšanu, final="true" norādot un reģistrējot. name *ir aizstājējzīme, kas nozīmē, Microsoft System.Net.Http ka tā attiecas uz visām saistītajām bibliotēkām. , bet apstājieties šeit maxlevel="Info" Trace , Debug Information jo WArningNākamajās Error definīcijās tiek izvadīts arī logs , Critical kas atrodas .

Ceturtais ir izvade final="true" uz failu, kas nav iepriekš apturētais žurnāls.

Arhīva žurnāli

Ir arī metode, kā arhivēt veco žurnālfailu atsevišķā mapē katram datumam ar tikai vienu galveno žurnālfailu.

Piemēram:

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

Šeit izmantotie parametri nozīmē:

Parametra apraksts
arhīvsNumurēšana Datums izveido arhīva failu pēc datuma.
arhīvsKomēdija Diena tiek izmantota, lai arhivētu ikdienā. Ir arī veidi, kā norādīt "Mēnesis", "Stunda", "Svētdiena" utt.
arhīva faila nosaukums Ceļš uz arhivēšanu. {#} izmaiņas veiktas, izmantojot arhīvu atsevišķi.
arhivētDateFormat Faila nosaukuma datuma līdz datumam arhīva datuma formāts.
maxArchiveFiles (MaxArchiveFiles) Norāda, līdz kuriem arhivētajiem failiem.

Ir arī veidi, kā arhivēt nevertēšanas metodes. Lai iegūtu papildinformāciju, skatiet oficiālo tīmekļa vietni.

Izpildot to, tas izskatās šādi:

Sūtīt e-pasta ziņojumus pa žurnāliem

NLog arī ļauj nosūtīt e-pastus, piesakoties. Tomēr, ja nosūtāt e-pasta ziņojumu, piemēram, atkļūdošanas žurnālu, tas kļūs pārāk daudz, lai to nosūtītu, Ieteicams atlasīt tikai ierobežotus žurnāla līmeņus, piemēram, Error un Fatal. Turklāt, lai izvairītos no kļūmju riska, piemēram, pasta servera bloķēšanas overs pārraides dēļ, Ieteicams norādīt tikai žurnālā reģistrētu e-pasta kontu.

Tālāk sniegts konfigurācijas piemērs. Ja vēlaties faktiski nosūtīt pastu, izpildiet SMTP serveri, kuru vēlaties izmantot.

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

Žurnālu rakstīšana datu bāzē

NLog var arī rakstīt žurnālus datu bāzē. Tālāk ir sniegts piemērs, tāpēc, lūdzu, skatiet oficiālo tīmekļa vietni, lai iegūtu sīkāku informāciju.

Šajā sadaļā aprakstītas darbības, kas jāveic, lai rakstītu SQL Server citā serverī.

Vispirms izveidojiet tabulu, lai pieteiktos mērķa SQL Server. Tā kā varat izvēlēties ierakstāmo vērtību, definējiet, kas nepieciešams kā žurnāls kā kolonna.

Tālāk sniegts tabulas izveides SQL piemērs.

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

Datu bāzes apstrādei System.Data.SqlClient ir nepieciešama datu bāzes klientu bibliotēka. Uzstādīsim to no NuGet.

Raksta datu bāzes informāciju appsettings.json. nlog.config ļauj ielādēt informāciju appsettings.json. Iestatījumi ir varbūtēji, tāpēc, lūdzu, iestatiet tos atbilstoši faktiskajai datu bāzei. Atslēgas nosaukums ir patvaļīgs, bet to izmanto nlog.config.

{
  "": "省略",

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

Iestatiet nlog.config šādi:

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

Ja nav izpildāmu kļūdu, tas tiks rakstīts šādi:

Starp citu.cs ņemiet vērā, ka mēģinājums rakstīt žurnālus datu bāzē agrīnā stadijā, piemēram, pirms programmas .cs CreateHostBuilder metodēm, var neizdoties.

Iegūstiet reģistrētājus no RequestServices un reģistrējiet tos

Katru reizi, kad izveidojat jaunu kontrolleri vai lapas modeli, ILogger konstruktoram var būt garlaicīgi. Alternatīvi, RequestServices jūs varat saņemt no .

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

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

Ja arī sava kontroliera vai lapas modeļa norādīšana ir apgrūtinoša, varat izveidot paplašinājuma metodes vai pamatklases.

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

Izmantot pieteikumus

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

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