Logimiseks kasutage NLogi

Lehe loomise kuupäev :

Keskkond

Visuaalstuudio
  • Visuaalstuudio 2019
ASP.NET Tuum
  • 5.0 (MVC, Razori leht)

Alguses

NLog võimaldab teil väljastada logisid failidele, e-kirjadele ja andmebaasidele sõltuvalt teie sätetest.

NLog ASP.NET lisada core'i standardsesse logimissüsteemi. Logisid on võimalik vaikelogija abil väljastada vastavalt sätetele.

Teave logitasemete kohta

Microsofti logid ja NLogid on jagatud kuueks etapiks ja väljundtasemed on umbes samad:

Tase MicrosoftNLog
0 Jälgi Jälgi
1 Debug Debug
2 Teavet Info
3 Hoiatus Hoiatada
4 Viga Viga
5 Kriitiline Surmaga
(6) (Pole) (Väljas)

Mida kõrgem on tase, seda olulisem on logi ja seda tõenäolisem on selle kirjutamine sõltumata logi väljundi piirangutest.

Logimisjuhised

NLog paketi juurutamine

ASP.NET olete loonud Core'i projekti, lisage pakett.

Paremklõpsake oma projekti sõltuvusi ja valige Käsk Halda NuGeti pakette.

NLogiga seotud pakettide kuvamiseks klõpsake vahekaarti Sirvi ja tippige otsinguväljale NLog.

Valige NLog ja seejärel klõpsake installinuppu, kus on valitud uusim stabiilne versioon.

Klõpsake nuppu OK.

Installige ka NLog.Web.AspNetCore.

Pakett on projekti lisatud.

Lisa nlog.config

Lisage projekti NLog logi väljundmääratlus nlog.config. Sisu on XML-vormingus, seega lõin selle XML-failina. Faili nimi peaks olema nlog.config (väiketäht).

Looge fail järgmiselt: Üksikasjalikke sätteid arutatakse hiljem.

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

Veenduge, et atribuudid nlog.config on seatud järk tegevus: sisu, kopeeri väljundkataloogi: kopeerige, kui uus.

Redigeeri appsetting.json

Vaikimisi, olenemata sellest, kuidas määrate faili nlog.config, Information on väljundiks ainult need tasemed. Seda seetõttu, et logimine tugineb ka appsetting.json.

Avage appsetting.json Logging.LogLevel.Default ja muutke väärtus väärtuseks Trace . Kui kasutate NLogi, saate taset reguleerida NLogi poolel, nii et saate rakenduse appsetting.json seadmisega väljastada peaaegu kõik Trace tasemed.

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

Samuti on arenduse ajal appsettings. Development.json seaded on laetud, nii et me muudame neid ka.

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

Programmide ettevalmistamine NLogi jaoks

Lisage programm, et saaksite NLog-mehhanismi sisse logida.

Avage .cs programmifail ja parandage see järgmiselt:

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

Metsaraie

MVC projektide HomeComtroller puhul , Razori lehtede puhul, IndexModel oleks teid ILogger<IndexModel> logger konstruktorile edastatud. Selle väärtuseks on seatud ka _logger privaatväli, nii et saate seda kasutada logimiseks.

Järgnev on näide Razori lehe väljundist, kuid MVC saab sama koodiga väljastada.

// 省略

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

Silumisel arvan, et projekti kausta saab teha logifaili.

Logi kontrollimiseks vaadake faili sisu.

Nlog.config kommentaariumi näidis

Ma seletan seda järjekorras, aga ma ei selgita vähem tähtsaid osi.

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

On parameetreid, näiteks NLogi enda logiväljundi sätted.

internalLogFile on logi sihtkoht. See võib olla kasulik näiteks juhul, kui logi enda väljundis on viga. ${basedir} viitab programmi täitmiskaustale.

internalLogLevel on NLogi logi väljundtase. Off kui on, siis ei ole see üldse väljund.

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

Muutuja on seatud sellele, millises paigutuses logi sisu väljastatakse. Saate tippida otse hilisematesse sihtmärkidesse, kuid kui määrate sama paigutuse mitu, on neid lihtsam hallata ühes muutujas.

Parem on viidata ametlikule veebisaidile, et näha, milliseid parameetreid saab paigutuses määrata.

Viiteks on siin määratud parameetrid väljund järgmises vormingus:

Parameetri väljundsisu
longdate Kuupäeva ja kellaaja minutid nagu "2021-03-17 11:46:36.5034"
sündmuse atribuudid Kuvab programmi määratud logiväljundi sündmuse ID jne.
Tasandil Tasemed nagu Jälitus ja Tõrge
Sõnum Programmi logimisel määratud teade
Erand Mida teha, kui läbite programmi logimisel erandi?
kutsuja Logimiskoht, faili nimi jne.

Väljundi näide

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äärab väljundi sihtmärgi. Määrata saab mitu.

Esimene xsi:type="Trace" määrab ja logi prinditakse Visual Studio väljundaknas. Seda saab kasutada peamiselt silumise käivitamiseks.

Teine xsi:type="File" määrab ja logib määratud tee faili. Kui ${shortdate} määrate tee, saate logi kirjutada logi kuupäeva faili logi ajal. Määrab ka ${aspnet-appbasepath} veebiprojekti juurkausta. Kuid töötamisel on parem programmi asendamiseks ja turvalisuseks väljastada logifaile väljaspool veebikataloogi.

Kolmas on xsi:type="Console" määratud ja seda saab konsoolirakenduse konsoolis kuvada. ASP.NET Core ise ei ole konsooli rakendus, kuid seda saab kasutada ka sellistes keskkondades nagu Docker ja Azure, kuna olekut saab konsoolis kuvada. See on kirjeldus NLogi ametlikul veebisaidil.

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

Siin saate määrata, millisel tasemel ja mis tüüpi logisid väljastada kuhu. Seda kirjeldust rakendatakse ülevalt üles.

Esimene on name="*" kõigi logide väljastamine sihtmärgile, kuna tase on writeTo määratud . See target on jaotises määratud, nii et see kuvatakse TraceOutput Visual Studio väljundis.

Teine on Microsoft.Hosting.Lifetime väljund logi väljundisse writeTo (コンソール) teegis. ConsoleLifetime'i seoseid saab kontrollida konsoolides nagu Azure ja Docker. minlevel="Info" kuna see Trace Debug määrab ja pole logitud. Samuti ei väljasta järgnevad final="true" Microsoft.Hosting.Lifetime määratlused seotud logisid.

Kolmas name="Microsoft.*" on name="System.Net.Http.*" logimise final="true" lõpetamine, määrates ja logid. name *on metamärk, mis tähendab, Microsoft System.Net.Http et see viitab kõigile seotud teekidele. , kuid lõpetage siin maxlevel="Info" Trace , Debug Information sest WArningLogi Error , on väljund ka järgmistes Critical määratlustes.

Neljas on väljund final="true" faili, mis pole ülal peatatud logi.

Logide arhiveerimine

Samuti on olemas meetod vana logifaili arhiveerimiseks eraldi kausta iga kuupäeva jaoks, millel on ainult üks peamine logifail.

Näiteks:

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

Siin kasutatavad parameetrid tähendavad:

Parameetri kirjeldus
arhiivNummerdamine Kuupäev loob arhiivifaili kuupäeva järgi.
arhiivEvery Päeva kasutatakse igapäevaseks arhiveerimiseks. Samuti on võimalik määrata "Kuu", "Tund", "Pühapäev" jne.
arhiivFileName Arhiivimise tee. {#} muutub arhiivipõhiselt.
arhiivDateFormat Failinime kuupäevapõhise arhiivi kuupäevavormingus.
maxArchiveFiles Määrab, mitu faili kuni arhiivida.

Kuupäevaväliste meetodite arhiveerimiseks on ka viise. Lisateavet leiate ametlikust veebisaidilt.

Kui see hukatakse, näeb see välja selline:

Saada e-kirju logi kohta

NLog võimaldab teil ka logimisel e-kirju saata. Kuid kui saadate e-kirja, näiteks silumislogi, muutub see liiga palju saatmiseks, Mõistlik on sihtida ainult piiratud logitasemeid (nt Viga ja Saatuslik). Lisaks, et vältida ebaõnnestumise ohtu, näiteks postiserveri blokeerimine üleedastuse tõttu, Soovitame määrata ainult logitud meilikonto.

Järgnev on konfiguratsiooni näide. Kui soovite tegelikult meili saata, järgige SMTP-serverit, mida soovite kasutada.

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

Logide kirjutamine andmebaasi

NLog võib kirjutada logisid ka andmebaasi. Järgnev on näide, nii et lisateabe saamiseks vaadake ametlikku veebisaiti.

Selles jaotises kirjeldatakse juhiseid SQL Serverisse kirjutamiseks mõnes muus serveris.

Esmalt looge tabel siht-SQL Serverisse logimiseks. Kuna saate valida kirjutatava väärtuse, määratlege, mida vajate logina veeruna.

Järgnev on näide tabeli loomise SQL-ist.

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

Andmebaasi töötlemiseks on vaja andmebaasi System.Data.SqlClient klienditeeki. Paigaldame selle NuGetist.

Kirjutab andmebaasiteabe rakendusse appsettings.json. nlog.config võimaldab teil laadida teavet appsettings.json. Seaded on ebalevad, nii et palun seadke need vastavalt tegelikule andmebaasile. Võtme nimi on meelevaldne, kuid seda kasutab nlog.config.

{
  "": "省略",

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

Seadke nlog.config järgmiselt:

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

Kui käivitada ei ole vigu, kirjutatakse see järgmiselt:

Muide.cs pange tähele, et proovides kirjutada logisid andmebaasi varases etapis, näiteks enne programmi .cs CreateHostBuilder meetodeid, võib nurjuda.

Logijate toomine RequestServices'ist ja nende logimine

Konstruktorile võib olla tüütu lisada iga kord, kui ILogger loote uue kontrolleri või leheküljemudeli. Teise võimalusena RequestServices saate .

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

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

Kui ka oma kontrolleri või lehemudeli määramine on tülikas, saate luua laiendusmeetodeid või põhiklasse.

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

Kasuta teenindusjuhtumeid

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

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