Kirjaa lokiin NLog-lokin avulla

Sivun luontipäivämäärä :

Ympäristö

Visuaalinen studio
  • Visual Studio 2019
ASP.NET ydin
  • 5.0 (MVC, Razor-sivu)

Aluksi.

NLogin avulla voit tulostaa lokit tiedostoihin, sähköposteihin ja tietokantoihin asetusten mukaan.

NLog ASP.NET on sisällytettävä ytimen vakiokirjausjärjestelmään. Lokit on mahdollista tulostaa asetusten mukaan oletuslokia käytettäessä.

Tietoja lokitasoista

Microsoft-lokit ja NLog-lokit on jaettu kuuteen vaiheeseen, ja tulostustasot ovat suunnilleen samat:

Taso MicrosoftNLog
0 Jäljittää Jäljittää
1 Debug Debug
2 Huoneesta Info
3 Varoitus Varoittaa
4 Virhe Virhe
5 Kriittinen Kohtalokas
(6) (Ei mitään) Ei, ei, ei.

Mitä korkeampi taso, sitä tärkeämpi loki on, ja sitä todennäköisemmin se kirjoitetaan lokin tulostusrajoituksista riippumatta.

Kirjaamisohjeet

NLog-paketin käyttöönotto

ASP.NET kun olet luonut Ydinprojektin, lisää paketti.

Napsauta projektin riippuvuuksia hiiren kakkospainikkeella ja valitse Hallitse NuGet-paketteja.

Valitse Selaa-välilehti ja tuo NLogiin liittyvät paketit näkyviin kirjoittamalla hakukenttään NLog.

Valitse NLog ja napsauta sitten asennuspainiketta, jossa uusin vakaa versio on valittuna.

Valitse OK.

Asenna myös NLog.Web.AspNetCore.

Paketti on lisätty projektiin.

Lisää nlog.config

Lisää projektiin nlog.config, NLog-lokin tulostusmääritys. Sisältö on XML-muodossa, joten loin sen XML-tiedostona. Tiedostonimen on oltava nlog.config (pienillä kirjaimilla).

Luo tiedosto seuraavasti: Yksityiskohtaisista asetuksista keskustellaan myöhemmin.

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

Varmista, että nlog.config-tiedoston ominaisuudet ovat Muodosta toiminto: Sisältö, Kopioi tulostuskansioon: Kopioi, jos uusi.

Muokkaa appsetting.json

Oletusarvon mukaan vain nämä tasot tulostuvat riippumatta siitä, miten nlog.config Information määritetään. Tämä johtuu siitä, että kirjaaminen perustuu myös appsetting.jsoniin.

Avaa appsetting.json Logging.LogLevel.Default ja muuta arvoksi Trace . Jos käytät NLog-sovellusta, voit säätää NLog-puolen tasoa, joten voit tulostaa käytännössä kaikki Trace tasot asettamalla appsetting.json.

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

Myös kehityksen aikana appsettings. Development.json-asetukset on ladattu, joten muutamme myös niitä.

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

Valmistellaan ohjelmia NLog-ohjelmaa varten

Lisää ohjelma, jotta voit kirjautua NLog-mekanismiin.

Avaa .cs ohjelmatiedosto ja korjaa se seuraavasti:

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

Kirjaaminen

HomeComtrollerMVC-projekteissa, IndexModel Razor-sivuilla, sinut olisi ILogger<IndexModel> logger välitetty konstruktorille. Sen arvoksi on _logger määritetty myös yksityinen kenttä, joten voit käyttää sitä kirjautumisena.

Seuraavassa on esimerkki Razor-sivun tulostista, mutta MVC voi tulostaa samalla koodilla.

// 省略

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

Kun virheenkorjaus tehdään, luulen, että lokitiedosto voidaan tehdä projektin kansioon.

Voit tarkistaa lokin tarkastelemalla tiedoston sisältöä.

Esimerkki nlog.config-kommentista

Selitän sen järjestyksessä, mutta en vähemmän tärkeitä osia.

<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 olemassa parametreja, kuten itse NLog-lokin tulostusasetukset.

internalLogFile on lokin määränpää. Tästä voi olla hyötyä esimerkiksi silloin, jos itse lokin tulosteessa on virhe. ${basedir} viittaa ohjelman suorituskansioon.

internalLogLevel on NLog-lokin tulostustaso. Off Jos se on, sitä ei tulosteta ollenkaan.

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

Muuttujan arvoksi on määritetty, mihin asetteluun lokin sisältö tulostetaan. Voit kirjoittaa suoraan myöhempiin kohteisiin, mutta jos määrität saman asettelun kerrannaisten, niitä on helpompi hallita yhdessä muuttujassa.

On parempi viitata viralliseen verkkosivustoon nähdäksesi, mitä parametreja asettelussa voidaan määrittää.

Tässä määritetyt parametrit tulostuvat seuraavassa muodossa:

Parametrien tulostussisältö
pitkäikäis Päivämäärä- ja aikaminuutteina, kuten "2021-03-17 11:46:36.5034"
tapahtuman ominaisuudet Näyttää ohjelman määrittämän lokilähdön tapahtumatunnuksen jne.
Tasolla Tasot, kuten Jäljitys ja virhe
Viesti Ohjelman lokiin kirjaamisen yhteydessä määritetty viesti
Poikkeus Entä jos ohitat poikkeuksen ohjelman kirjaamisen yhteydessä
kutsusivusto Lokiin kirjaamisen sijainti, tiedostonimi jne.

Esimerkki tulosteista

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äärittää tulostettavan kohteen. Useita voidaan määrittää.

Ensimmäinen xsi:type="Trace" määrittää , ja loki tulostetaan Visual Studion tulostusikkunaan. Sitä voidaan käyttää ensisijaisesti suorittamisen virheenkorjaamiseen.

Toinen xsi:type="File" määrittää määritetyssä polussa olevan tiedoston ja kirjaa sen lokiin. Jos ${shortdate} määrität polussa, voit kirjoittaa lokin lokin päivämäärän lokiin lokin ajankohtana. Määrittää ${aspnet-appbasepath} myös Web-projektin pääkansion. Kun toimit, on kuitenkin parempi tulostaa lokitiedostoja Web-hakemiston ulkopuolelle ohjelman korvaamista ja suojausta varten.

Kolmas on xsi:type="Console" määritetty, ja se voidaan näyttää konsolisovelluksen konsolissa. ASP.NET Core itsessään ei ole konsolisovellus, mutta sitä voidaan käyttää myös dockerin ja Azuren kaltaisissa ympäristöissä, koska tila voidaan näyttää konsolissa. Tämä on kuvaus NLogin virallisella verkkosivustolla.

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

Tässä voit määrittää, minkä taso ja minkä tyyppisiä lokeja tulosteta mihinkin. Tätä kuvausta käytetään ylhäältä ylös.

Ensimmäinen on kaikkien name="*" lokien tulostaminen kohteeseen, koska taso on writeTo määritetty määritettäessä . Tämä target on -kohdassa määritetty, joten se TraceOutput näkyy Visual Studion tulosteessa.

Toinen Microsoft.Hosting.Lifetime tuloste tuloste on kirjaston lokitulosteeseen. writeTo (コンソール) ConsoleLifetime-kytkennät voidaan tarkistaa konsoleista, kuten Azure ja Docker. minlevel="Info" koska se Trace Debug määrittää , eikä sitä kirjata lokiin. Seuraavat määritelmät eivät myöskään tulosta toisiinsa final="true" Microsoft.Hosting.Lifetime liittyviä lokeja.

Kolmas on name="Microsoft.*" lopettaa name="System.Net.Http.*" kirjaaminen final="true" määrittämällä - ja -lokit. name *on yleismerkki, mikä tarkoittaa, Microsoft System.Net.Http että se viittaa kaikkiin siihen liittyviin kirjastoihin. Mutta lopeta maxlevel="Info" Trace Debug Information tähän, koska. WArning- Error ja -loki tulostetusti myös myöhemmissä Critical määritelmissä.

Neljäs tuloste tuloste on final="true" tulostettu muuhun kuin yllä pysäytettyun lokiin.

Arkistoinnin lokit

On myös olemassa tapa arkistoida vanha lokitiedosto erilliseen kansioon kullekin päivämäärälle, jossa on vain yksi päälokitiedosto.

Esimerkiksi:

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

Tässä käytetyt parametrit tarkoittavat:

Parametrin kuvaus
arkistoNumeroiminen Päivämäärä luo arkistotiedoston päivämäärän mukaan.
arkistoEvery Päivää käytetään arkistointiin päivittäin. On myös tapoja määrittää "Kuukausi", "Tunti", "Sunnuntai" jne.
archiveFileName-nimi Polku arkistoida. {#} muuttuu arkistoittain.
arkistoDateFormat Tiedostonimen päivämääräpäivämuoto.
maxArchiveFiles-tiedosto Määrittää, kuinka monta tiedostoa arkistoidaan.

On myös tapoja arkistoida muita kuin päivämäärämenetelmiä. Lisätietoja on virallisella verkkosivustolla.

Kun se suoritetaan, se näyttää tältä:

Sähköpostien lähettäminen lokia kohden

NLogin avulla voit myös lähettää sähköposteja kirjautuessasi. Jos kuitenkin lähetät sähköpostia, kuten virheenkorjauslokin, siitä tulee liian paljon lähetettävää, On hyvä kohdistaa vain rajoitetut lokitasot, kuten Virhe ja Kohtalokas. Lisäksi virheriskin välttämiseksi, kuten postipalvelimen estäminen ylilähetysten vuoksi, Suosittelemme, että määrität vain lokiin kirjautulle sähköpostitilille.

Seuraavassa on esimerkki konfiguraatiosta. Jos haluat todella lähettää sähköpostia, seuraa smtp-palvelinta, jota haluat käyttää.

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

Lokien kirjoittaminen tietokantaan

NLog voi myös kirjoittaa lokeja tietokantaan. Seuraava on esimerkki, joten katso lisätietoja viralliselta verkkosivustolta.

Tässä osassa kuvataan vaiheet, jotka on kirjoitettava SQL Serveriin eri palvelimessa.

Luo ensin taulukko SQL Server -kohteeseen kirjautumista varten. Koska voit valita kirjoitettavan arvon, määritä loki sarakkeeksi.

Seuraavassa on esimerkki taulukon luomisen SQL:stä.

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

Tietokannan käsittelyyn tarvitaan System.Data.SqlClient tietokanta-asiakaskirjasto. Asennetaan se NuGetista.

Kirjoittaa tietokannan tiedot appsettings.json-sivustoon. nlog.configin avulla voit ladata tiedot appsettings.json-sivustossa. Asetukset ovat alustavat, joten aseta ne todellisen tietokannan mukaan. Avaimen nimi on mielivaltainen, mutta sitä käyttää nlog.config.

{
  "": "省略",

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

Aseta nlog.config seuraavasti:

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

Jos virheitä ei ole, se kirjoitetaan seuraavasti:

Huomaa muuten.cs että lokien kirjoittaminen tietokantaan varhaisessa vaiheessa, kuten ennen ohjelman CreateHostBuilder .cs, saattaa epäonnistua.

Hae loggerit RequestServices-palveluista ja kirjaa ne lokiin

Konstruktoriin lisääminen voi olla työlästä aina, kun ILogger luot uuden ohjaimen tai sivumallin. Vaihtoehtoisesti RequestServices voit saada .

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

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

Jos myös oman ohjain- tai sivumallin määrittäminen on hankalaa, voit luoda laajennusmenetelmiä tai perusluokkia.

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

Käytä koteloita

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

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