Naplózás az NLog segítségével

Oldal létrehozásának dátuma :

Környezet

Visual Stúdió
  • Visual Studio 2019
ASP.NET mag
  • 5.0 (MVC, Razor oldal)

Először

Az NLog lehetővé teszi, hogy a beállításoktól függően naplókat küldjön fájlokba, e-mailekbe és adatbázisokba.

Az NLog ASP.NET beépíthető a Core szabványos naplózási rendszerébe. Az alapértelmezett naplózó használata közben a beállításoknak megfelelően lehetőség van naplók kimenő kimenőire.

A naplószintek – a

A Microsoft naplók és NLogs vannak osztva hat szakaszban, és a kimeneti szintek nagyjából ugyanaz:

Szint MicrosoftNLog
0 Nyomkövetési Nyomkövetési
1 Debug Debug
2 Információ Info
3 Figyelmeztetés Figyelmeztet
4 Hiba Hiba
5 Kritikus Végzetes
(6) (Nem) (Ki)

Minél magasabb a szint, annál fontosabb a napló, és annál valószínűbb, hogy meg kell írni, függetlenül a napló kimeneti korlátaitól.

Naplózási utasítások

NLog csomag telepítése

ASP.NET, hogy létrehozott egy Core projektet, adjon hozzá egy csomagot.

Kattintson a jobb gombbal a projekt függőségek parancsra, és válassza a NuGet-csomagok kezelése lehetőséget.

Kattintson a Tallózás fülre, és írja be az NLog parancsot a keresőmezőbe az NLogtal kapcsolatos csomagok megjelenítéséhez.

Válassza az NLog lehetőséget, majd kattintson a telepítés gombra, ha a legújabb stabil verzió van kijelölve.

Kattintson az OK gombra.

Telepítse az NLog.Web.AspNetCore webhelyet is.

A csomag hozzáadva a projekthez.

Nlog.config hozzáadása

Adja hozzá az nlog.config fájlt, az NLog-napló kimeneti definícióját a projekthez. A tartalom XML formátumban van, ezért XML-fájlként hoztam létre. A fájlnévnek nlog.confignak (kisbetűsnek) kell lennie.

Hozza létre a fájlt az alábbiak szerint: A részletes beállításokat később tárgyaljuk.

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

Győződjön meg arról, hogy az nlog.config tulajdonságai Build Action: Content, Copy to Output Directory: Copy if New ( Új példány) beállításra vannak állítva.

Appsetting.json szerkesztése

Alapértelmezés szerint az nlog.config beállítástól függetlenül csak Information ezek a szintek kimenetek. Ennek az az oka, hogy a naplózás az appsetting.jsonra is támaszkodik.

Nyissa meg az appsetting.json Logging.LogLevel.Default alkalmazást, és módosítsa az értéket Trace . Ha NLogot használ, módosíthatja az NLog oldalon található szintet, így gyakorlatilag minden szintet Trace kiadhat az appsetting.json beállításával.

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

Is, a fejlesztés során, appsettings. A Development.json beállításai be vannak töltve, ezért azokat is megváltoztatjuk.

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

Programok előkészítése az NLog számára

Adjon hozzá egy programot, hogy bejelentkezhet az NLog mechanizmusba.

Nyissa .cs programfájlt, és javítsa ki az alábbiak szerint:

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

Naplózási

Az MVC projektek HomeComtroller esetében a IndexModel Razor-oldalak esetében a ILogger<IndexModel> logger konstruktorhoz került volna. A privát mezőre is _logger be van állítva, így naplózhatja.

Az alábbi példa egy Razor oldal kimenetére, de az MVC ugyanazokkal a kóddal tud kimenetet kimenő.

// 省略

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

Hibakereséskor úgy gondolom, hogy naplófájl készülhet a projekt mappájában.

A naplót a fájl tartalmának megnézésekor ellenőrizheti.

Minta nlog.config kommentár

Elmagyarázom, de nem magyarázom el a kevésbé fontos részeket.

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

Vannak paraméterek, például maga az NLog naplókimeneti beállításai.

internalLogFile lesz a cél a napló. Ez hasznos lehet például, ha hiba van a napló kimenetében. ${basedir} a program végrehajtási mappájára utal.

internalLogLevel az NLog-napló kimeneti szintje. Off ha igen, akkor egyáltalán nem lesz kimenet.

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

A változó értéke az, hogy a napló tartalma milyen elrendezésben lesz kimenő. Közvetlenül is beírhat későbbi célokba, de ha ugyanannak az elrendezésnek a többszörösét adja meg, könnyebb kezelni őket egy változóban.

Jobb, ha a hivatalos weboldalra hivatkozik, hogy milyen paramétereket lehet megadni az elrendezésben.

Referenciaként az itt megadott paraméterek a következő formátumban vannak kimenettel:

Paraméter kimeneti tartalma
hosszúdátum Dátum és idő percek, mint például "2021-03-17 11:46:36.5034"
eseménytulajdonságok Megjeleníti a program által megadott naplókimenet eseményazonosítóját stb.
Szinten Szintek, mint például a nyomkövetés és a hiba
Üzenetet A programnaplózásban megadott üzenet
Kivétel Mi történik, ha kivételt ad át a programnaplózásban?
hívhely Naplózási hely, fájlnév stb.

Példa kimenetre

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>

Megadja a kimeneti célt. Több is megadva.

Az első xsi:type="Trace" megadja , és a napló nyomtatása a Visual Studio kimeneti ablakában. Elsősorban a végrehajtás hibakeresésére használható.

A második xsi:type="File" a megadott elérési út egy fájlját adja meg és naplózza. Ha megadja az elérési utat, a naplót a napló dátumának fájljába ${shortdate} írhatja a napló idején. A ${aspnet-appbasepath} webes projekt gyökérmappát is megadja. Működéskor azonban jobb, ha a naplófájlokat a webkönyvtáron kívülre adja ki a program cseréjéhez és biztonsághoz.

A harmadik meg xsi:type="Console" van adva, és megjeleníthető a konzolon a konzol alkalmazásban. ASP.NET Core önmagában nem konzolalkalmazás, de olyan környezetekben is használható, mint a Docker és az Azure, mert az állapot megjeleníthető a konzolon. Ez a leírás az NLog hivatalos honlapján.

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

Itt adhatja meg, hogy milyen szintű és milyen típusú naplókat adjon ki a kimenetnek, ahová. Ez a leírás felülről lefelé van alkalmazva.

Az első az, hogy name="*" az összes naplót a cél, mert a szint writeTo meg van adva megadása közben . Ez target a megadott , így megjelenik a Visual Studio TraceOutput kimenet.

A második a Microsoft.Hosting.Lifetime könyvtár naplókimenetének writeTo (コンソール) kimenete. A ConsoleLifetime-társítások olyan konzolokon is bevehetőek, mint az Azure és a Docker. minlevel="Info" mert megadja Trace Debug , és nincs naplózva. A későbbi definíciók nem eredményeznek final="true" Microsoft.Hosting.Lifetime kapcsolódó naplókat.

A harmadik name="Microsoft.*" az, hogy name="System.Net.Http.*" állítsa le a final="true" naplózás megadásával és naplók. name *egy helyettesítő karakter, ami azt jelenti, Microsoft System.Net.Http hogy az összes kapcsolódó könyvtárra vonatkozik. , de megáll maxlevel="Info" Trace itt, Debug Information mert WArningA Error , , napló a későbbi definíciókban is Critical kimenet.

A negyedik a fent final="true" leállított naplótól más fájlba való kimenet.

Archív naplók

Van is egy módszer archiválása a régi naplófájlt egy külön mappában minden dátumot csak egy fő naplófájlt.

Például:

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

Az itt használt paraméterek a következőket jelentik:

Paraméter leírása
archívSzámozás A Dátum dátum szerint hoz létre egy archív fájlt.
archívMinden Day használják archív napi rendszerességgel. A "Hónap", az "Óra", a "Vasárnap" stb.
archiveFileName Elérési út az archiváláshoz. {#} archív alapon változik.
archívDateFormat A fájlnév dátum-dátum dátumformátuma.
maxArchiveFiles Itt adhatja meg, hogy hány fájlt archiválhat.

A nem dátummal kapcsolatos módszerek archiválása is lehetséges. További információkért látogasson el a hivatalos honlapra.

Végrehajtáskor így néz ki:

E-mailek küldése naplónként

NLog is lehetővé teszi, hogy küldjön e-maileket, amikor naplózás. Ha azonban e-mailt küld, például hibakeresési naplót, az túl sok lesz ahhoz, hogy Célként csak korlátozott naplószinteket célozhat meg, például a Hiba és a Végzetes szintet. Ezenkívül a hiba kockázatának elkerülése érdekében, mint például a levélkiszolgáló blokkolása a túljeszedés miatt, Javasoljuk, hogy adjon meg egy csak bejelentkezési e-mail fiókot.

Az alábbi példa egy konfigurációra mutat be. Ha ténylegesen e-mailt szeretne küldeni, kövesse a használni kívánt SMTP-kiszolgálót.

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

Naplók írása az adatbázisba

Az NLog naplókat is írhat az adatbázisba. Az alábbiakban egy példa, ezért kérjük, olvassa el a hivatalos honlapján a részleteket.

Ez a szakasz azokat a lépéseket ismerteti, amelyekkel írhat egy másik kiszolgálóN az SQL Server kiszolgálóra.

Először hozzon létre egy táblázatot a cél SQL Serverben való naplózáshoz. Mivel kiválaszthatja az írni akarott értéket, oszlopként határozza meg, hogy mire van szüksége naplóként.

Az alábbiakban egy példa a tábla létrehozása 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

Az adatbázis-feldolgozáshoz System.Data.SqlClient adatbázis-ügyfélkönyvtár szükséges. Telepítsd a NuGet-ről.

Adatbázisadatokat ír az appsettings.jsonnak. Nlog.config lehetővé teszi, hogy töltse be az információkat appsettings.json. A beállítások feltételesek, ezért kérjük, állítsa be őket a tényleges adatbázisnak megfelelően. A kulcsnév tetszőleges, de az nlog.config használja.

{
  "": "省略",

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

Állítsa be az nlog.config fájlt az alábbiak szerint:

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

Ha nincsenek futtatható hibák, a következőképpen lesz megírva:

By the way.cs megjegyzik, hogy megpróbálja írni naplókat az adatbázisba a korai szakaszban, például mielőtt program .cs CreateHostBuilder módszerek, sikertelen lehet.

Naplózók bekérése a RequestServices szolgáltatásból és naplózása

Fárasztó lehet minden új vezérlő vagy oldalmodell létrehozásakor hozzáadni ILogger a konstruktorhoz. Alternatív RequestServices megoldásként, akkor kap a .

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

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

Ha a saját vezérlő vagy oldalmodell megadása is nehézkes, létrehozhat bővítménymódszereket vagy alaposztályokat.

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

Esetek használata

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

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