Použitie NLog na prihlásenie

Dátum vytvorenia strany :

Životné prostredie

Vizuálne štúdio
  • Visual Studio 2019
ASP.NET jadro
  • 5.0 (MVC, Britva stránka)

Najprv

NLog umožňuje výstup protokolov do súborov, e-mailov a databáz v závislosti od vašich nastavení.

NLog ASP.NET byť začlenený do štandardného systému zapisovania do denníka jadra. Protokoly je možné výstupovať podľa nastavení pri použití predvoleného záznamníka.

Informácie o úrovniach denníka

Denníky spoločnosti Microsoft a NLogs sú rozdelené do šiestich etáp a výstupné úrovne sú zhruba rovnaké:

Úroveň MicrosoftNLog
0 Stopových Stopových
1 Ladenie Ladenie
2 Informácie Info
3 Upozornenie Varovať
4 Chyba Chyba
5 Kritické Fatálne
(6) (Žiadne) (Vypnuté)

Čím vyššia je úroveň, tým dôležitejší je denník a tým je pravdepodobnejšie, že sa zapíše bez ohľadu na obmedzenia výstupu denníka.

Pokyny na zapisovanie do denníka

Nasadenie balíka NLog

ASP.NET ste vytvorili základný projekt, pridajte balík.

Kliknite pravým tlačidlom myši na položku Závislosti pre projekt a vyberte položku Spravovať balíky NuGet.

Kliknite na tlačidlo Prehľadávať kartu a zadajte NLog do vyhľadávacieho poľa zobraziť NLog-súvisiace balíky.

Vyberte NLog, a potom kliknite na tlačidlo inštalovať s najnovšou stabilnou verziou vybratá.

Kliknite na tlačidlo OK.

Nainštalujte tiež NLog.Web.AspNetCore.

Balík bol pridaný do projektu.

Pridať nlog.config

Pridať nlog.config, výstupná definícia denníka NLog, do projektu. Obsah je vo formáte XML, takže som ho vytvoril ako súbor XML. Názov súboru by mal byť nlog.config (malé písmená).

Vytvorte súbor nasledovne: Podrobné nastavenia budú prediskutované neskôr.

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

Uistite sa, že vlastnosti nlog.config sú nastavené na stavať akcie: obsah, kopírovať do výstupného adresára: Kopírovať, ak je nový.

Upraviť appsetting.json

V predvolenom nastavení, bez ohľadu na to, ako nastavíte nlog.config, Information len tieto úrovne sú výstup. Je to preto, že zapisovanie do denníka sa tiež spolieha na appsetting.json.

Otvorte súbor appsetting.json Logging.LogLevel.Default a zmeňte hodnotu na Trace . Ak používate NLog, môžete upraviť úroveň na strane NLog, takže môžete výstup prakticky všetky úrovne Trace nastavením appsetting.json.

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

Tiež, počas vývoja, znepokoiky. Nastavenia Development.json sú načítané, takže ich tiež meníme.

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

Pripravujú sa programy pre NLog

Pridajte program, aby ste sa mohli prihlásiť do mechanizmu NLog.

Otvorte .cs programový súbor a opravte ho nasledovne:

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

Zapisovanie do denníka

V prípade projektov MVC HomeComtroller by ste pre stránky Razor boli IndexModel odovzdaní ILogger<IndexModel> logger konštruktérovi. Je tiež nastavená _logger v súkromnom poli, takže ju môžete použiť na prihlásenie.

Nasleduje príklad výstupu zo stránky Razor, ale MVC môže výstup s rovnakým kódom.

// 省略

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

Pri ladení si myslím, že súbor denníka môže byť vyrobený v priečinku projektu.

Denník môžete skontrolovať tak, že sa pozriete na obsah súboru.

Ukážkový komentár nlog.config

Vysvetľujem to v poriadku, ale nevysvetľujem menej dôležité časti.

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

Existujú parametre, ako napríklad nastavenie výstupu denníka pre NLog sám.

internalLogFile bude cieľom denníka. Môže to byť užitočné, napríklad ak sa vyskytne chyba vo výstupe samotného denníka. ${basedir} odkazuje na priečinok vykonávania programu.

internalLogLevel je výstupná úroveň denníka NLog. Off ak áno, nebude to vôbec výstup.

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

Premenná je nastavená na rozloženie, v akom rozložení bude výstup obsahu denníka. Môžete zadať priamo do neskorších cieľov, ale ak zadáte viacero rovnakých rozložení, je jednoduchšie ich spravovať v jednej premennej.

Je lepšie sa obrátiť na oficiálnu webovú stránku, aby ste zistili, aké parametre môžu byť špecifikované v rozložení.

Pre referenciu, parametre špecifikované tu sú výstup v nasledujúcom formáte:

Obsah výstupu parametra
dlhý deň Dátum a čas minút, ako napríklad "2021-03-17 11:46:36.5034"
vlastnosti udalostí Zobrazí identifikáciu udalosti atď.
Úrovni Úrovne ako sledovanie a chyba
Správu Správa zadaná v zapisovaní do denníka programu
Výnimkou Čo ak prejdete výnimkou v zapisovaní do denníka programu
volať Umiestnenie zapisovania do denníka, názov súboru atď.

Príklad výstupu

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>

Určuje cieľ výstupu. Je možné zadáť viacero.

Prvý určuje xsi:type="Trace" , a denník sa vytlačí vo výstupnom okne Visual Studio. Môže sa použiť predovšetkým na ladenie vykonávania.

Druhý určuje xsi:type="File" a zaehlási do súboru v zadanej ceste. Ak ${shortdate} zadáte v ceste, môžete zapísať denník do súboru dátumu denníka v čase denníka. Určuje ${aspnet-appbasepath} aj koreňový priečinok pre webový projekt. Avšak, pri prevádzke, je lepšie výstup súborov denníka mimo webového adresára pre nahradenie programu a zabezpečenie.

Tretí je zadaný xsi:type="Console" a môže sa zobraziť v konzole v aplikácii konzoly. ASP.NET Core nie je konzolová aplikácia, ale môže sa používať aj v prostrediach ako Docker a Azure, pretože stav sa môže zobraziť v konzole. Toto je popis na oficiálnej webovej stránke 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>

Tu určíte, na akej úrovni a aký typ denníkov sa má výstup na miesto. Tento popis sa používa zhora hore.

Prvým je výstup name="*" všetkých denníkov do cieľa, pretože úroveň je zadaná writeTo pri zadání . Toto target je zadané v , takže sa zobrazí vo TraceOutput výstupe Visual Studio.

Druhý je Microsoft.Hosting.Lifetime výstup na výstup denníka v writeTo (コンソール) knižnici. Priradenia ConsoleLifetime je možné skontrolovať v konzolách, ako sú Azure a Docker. minlevel="Info" pretože určuje Trace Debug , a nie je prihlásený. Tiež následné definície nevydá súvisiace final="true" Microsoft.Hosting.Lifetime denníky.

Tretím je name="Microsoft.*" zastaviť name="System.Net.Http.*" zapisovanie final="true" do denníka zadaním pre a denníky. name *je zástupný znak, Microsoft System.Net.Http čo znamená, že odkazuje na všetky súvisiace knižnice. , ale zastavte sa maxlevel="Info" Trace Debug Information tu, pretože WArningDenník Error , je tiež výstupom v nasledujúcich Critical definíciách.

Štvrtý je výstup do final="true" iného súboru ako denník zastavil vyššie.

Archivovať denníky

Existuje tiež metóda archivácie starého súboru denníka v samostatnom priečinku pre každý dátum s iba jedným hlavným súborom denníka.

Napríklad:

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

Tu použité parametre znamenajú:

Popis parametra
archiveNumbering (Číslovanie) Dátum vytvorí archívny súbor podľa dátumu.
archívVšetka Deň sa používa na každodennú archiváciu. Existujú aj spôsoby, ako zadať "Mesiac", "Hodina", "Nedeľa" atď.
názov archiveFileName Cesta k archivácie. {#} sa mení podľa archivácie.
ArchivovaťDateFormat Formát dátumu archivácie názvu súboru podľa dátumu.
maxArchiveFiles (MaxArchiveFiles) Určuje, do koľkých súborov sa má archivovať.

Existujú aj spôsoby archivácie neštatútnych metód. Ďalšie informácie nájdete na oficiálnej webovej lokalite.

Po vykonaní to vyzerá takto:

Odosielanie e-mailov podľa denníka

NLog tiež umožňuje posielať e-maily pri zapisovaní do denníka. Ak však odošlete e-mail, napríklad denník ladenia, bude príliš veľa na odoslanie, Je vhodné zamerať sa len na obmedzené úrovne denníka, ako napríklad Chyba a Fatálne. Okrem toho, aby sa zabránilo riziku zlyhania, ako je blokovanie poštového servera v dôsledku nadmerného prenosu, Odporúčame zadať e-mailové konto iba na denník.

Nasleduje príklad konfigurácie. Ak chcete skutočne odoslať poštu, postupujte podľa servera SMTP, ktorý chcete použiť.

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

Zapísať denníky do databázy

NLog môžete tiež zapisovať denníky do databázy. Nasleduje príklad, preto si podrobnosti nájdete na oficiálnej webovej stránke.

Táto časť popisuje kroky na zápis na server SQL Server na inom serveri.

Najprv vytvorte tabuľku pre prihlásenie do cieľového servera SQL Server. Keďže môžete vybrať hodnotu na zápis, definujte, čo potrebujete ako denník ako stĺpec.

Nasleduje príklad vytvorenia tabuľky 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

Na spracovanie databázy sa System.Data.SqlClient vyžaduje knižnica databázových klientov. Nainštalume ho z NuGet.

Zapíše informácie o databáze do súboru appsettings.json. nlog.config vám umožňuje načítať informácie v appsettings.json. Nastavenia sú nezáväzné, preto ich nastavte podľa aktuálnej databázy. Názov kľúča je ľubovoľný, ale používa ho súbor nlog.config.

{
  "": "省略",

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

Nastaviť nlog.config takto:

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

Ak nie sú žiadne chyby na spustenie, bude napísaný nasledovne:

Mimochodom.cs, že pokus o zápis denníkov do databázy v počiatočnom štádiu, napríklad pred program .cs CreateHostBuilder metódy, môže zlyhať.

Získajte záznamníkov z RequestServices a prihláste ich

Pridanie do konštruktora môže byť únavné pri každom vytvorení ILogger nového ovládača alebo modelu stránky. Prípadne môžete RequestServices získať z .

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

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

Ak je zadanie vlastného ovládača alebo modelu stránky tiež ťažkopádne, môžete vytvoriť metódy rozšírenia alebo základné triedy.

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

Použitie prípadov

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

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