Utilisez NLog pour vous connecter

Date de création de la page :

environnement

Studio visuel
  • Studio visuel 2019
ASP.NET noyau
  • 5.0 (MVC, Page Razor)

au début

NLog vous permet de créer des journaux de fichiers, d’e-mails et de bases de données en fonction de vos paramètres.

NLog ASP.NET être incorporé dans le système d’enregistrement standard du noyau. Il est possible de déconnecter les journaux en fonction des paramètres lors de l’utilisation de l’enregistreur par défaut.

À propos des niveaux de journal

Les journaux Microsoft et les NLogs sont divisés en six étapes, et les niveaux de sortie sont à peu près les mêmes :

Niveau MicrosoftNLog
0 trace trace
1 déboguer déboguer
2 information info
3 avertissement avertir
4 erreur erreur
5 critique fatal
(6) (Aucun) (Off)

Plus le niveau est élevé, plus le journal est important et plus il est susceptible d’être écrit indépendamment des contraintes de sortie du journal.

Instructions d’enregistrement

Déploiement du paquet NLog

ASP.NET vous avez créé un projet Core, ajoutez un package.

Cliquez à droite Dépendances pour votre projet et sélectionnez Gérer les packages NuGet.

Cliquez sur l’onglet Parcourir et taper NLog dans le champ de recherche pour afficher les paquets liés à NLog.

Sélectionnez NLog, puis cliquez sur le bouton d’installation avec la dernière version stable sélectionnée.

Cliquez sur OK.

Installez également NLog.Web.AspNetCore.

Le paquet a été ajouté au projet.

Ajouter nlog.config

Ajoutez nlog.config, la définition de sortie du journal NLog, au projet. Le contenu est en format XML, alors je l’ai créé comme un fichier XML. Le nom du fichier doit être nlog.config (minuscule).

Créez le fichier comme suit : Les paramètres détaillés seront discutés ultérieurement.

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

Assurez-vous que les propriétés de nlog.config sont définies pour construire l’action : contenu, copie à l’annuaire de sortie : Copiez si nouveau.

Modifier appsetting.json

Par défaut, peu importe comment vous définissez nlog.config, Information seuls ces niveaux sont de sortie. C’est parce que l’enregistrement s’appuie également sur appsetting.json.

Ouvrez appsetting.json Logging.LogLevel.Default et changez la valeur en Trace . Si vous utilisez NLog, vous pouvez ajuster le niveau du côté NLog, de sorte que vous pouvez la sortie pratiquement tous les niveaux Trace en paramètre appsetting.json.

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

En outre, pendant le développement, appsettings. Les paramètres development.json sont chargés, donc nous les changeons aussi.

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

Préparation des programmes pour NLog

Ajoutez un programme pour que vous puissiez vous connecter au mécanisme NLog.

Ouvrez .cs fichier de programme et corrigez-le comme suit :

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

exploitation forestière

Pour les projets HomeComtroller MVC, pour les pages IndexModel Razor, vous avez été transmis ILogger<IndexModel> logger au constructeur. Il est également défini dans le _logger domaine privé, de sorte que vous pouvez l’utiliser pour vous connecter.

Ce qui suit est un exemple de sortie à partir d’une page Razor, mais MVC peut sortie avec le même code.

// 省略

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

Lors du débogage, je pense qu’un fichier journal peut être fait dans le dossier du projet.

Vous pouvez vérifier le journal en regardant le contenu du fichier.

Exemple nlog.config commentaire

Je l’explique dans l’ordre, mais je n’explique pas les parties les moins importantes.

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

Il existe des paramètres, tels que les paramètres de sortie de journal pour NLog lui-même.

internalLogFile sera la destination du journal. Cela peut être utile, par exemple, s’il y a une erreur dans la sortie du journal lui-même. ${basedir} se réfère au dossier d’exécution du programme.

internalLogLevel est le niveau de sortie du journal NLog. Off si c’est le cas, ce ne sera pas du tout la sortie.

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

La variable est définie en fonction de la disposition dans quelle disposition le contenu du journal sera sortie. Vous pouvez taper directement sur des cibles ultérieures, mais si vous spécifiez plusieurs de la même mise en page, il est plus facile de les gérer en une seule variable.

Il est préférable de se référer au site officiel pour voir quels paramètres peuvent être spécifiés dans la mise en page.

Pour référence, les paramètres spécifiés ici sont la sortie dans le format suivant :

Contenu de sortie paramètre
longdate (longdate) Date et minutes telles que « 2021-03-17 11:46:36.5034 »
propriétés événement Affiche l’ID d’événement, etc. de la sortie journal spécifiée par le programme
niveau Niveaux tels que trace et erreur
Message Message spécifié dans l’enregistrement du programme
exception Que se passe-t-il si vous réussissez l’exception dans l’enregistrement des programmes
site d’appels Emplacement de journalisation, nom du fichier, etc.

Exemple de sortie

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>

Spécifie la cible à la sortie. Plusieurs peuvent être spécifiés.

Le premier xsi:type="Trace" spécifie, et le journal est imprimé dans la fenêtre de sortie Visual Studio. Il peut être utilisé principalement pour le débogage de l’exécution.

Le second xsi:type="File" spécifie et se connecte à un fichier dans le chemin spécifié. Si vous ${shortdate} spécifiez dans le chemin, vous pouvez écrire le journal au fichier de la date du journal au moment du journal. ${aspnet-appbasepath} Spécifie également le dossier racine du projet Web. Toutefois, lors de l’exploitation, il est préférable de sortir les fichiers journaux en dehors de l’annuaire Web pour le remplacement du programme et la sécurité.

Le troisième est xsi:type="Console" spécifié et peut être affiché dans la console de l’application console. ASP.NET Core lui-même n’est pas une application console, mais il peut également être utilisé dans des environnements tels que Docker et Azure parce que l’état peut être affiché dans la console. C’est la description sur le site officiel de 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>

Ici, vous spécifiez quel niveau et quel type de journaux à la sortie à l’endroit où. Cette description est appliquée de haut en haut.

Le premier est de sortie name="*" de tous les journaux à la cible parce que le niveau est spécifié tout en writeTo spécifier . target C’est le spécifié dans , de sorte TraceOutput qu’il apparaît dans la sortie Visual Studio.

Le second est Microsoft.Hosting.Lifetime la sortie de la sortie journal dans la writeTo (コンソール) bibliothèque. Les associations ConsoleLifetime peuvent être vérifiées sur des consoles telles qu’Azure et Docker. minlevel="Info" parce Trace Debug qu’il spécifie , et n’est pas connecté. En outre, les définitions ultérieures ne sont pas des final="true" Microsoft.Hosting.Lifetime journaux liés à la sortie.

Le troisième name="Microsoft.*" est name="System.Net.Http.*" d’arrêter final="true" l’enregistrement en spécifier pour et journaux. name *est une wildcard, ce qui signifie Microsoft System.Net.Http qu’il se réfère à toutes les bibliothèques connexes. , mais arrêtez-vous maxlevel="Info" Trace ici, Debug Information parce que WArningLe Error , journal est également la sortie dans les Critical définitions ultérieures.

Le quatrième est la sortie final="true" d’un fichier autre que le journal arrêté ci-dessus.

Journaux d’archives

Il existe également une méthode d’archivage de l’ancien fichier journal dans un dossier distinct pour chaque date avec un seul fichier journal principal.

par exemple:

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

Les paramètres utilisés ici signifient :

Description des paramètres
archiveNumbering La date crée un fichier d’archives par date.
archiveTout Day est utilisé pour archiver sur une base quotidienne. Il existe également des moyens de spécifier « Mois », « Heure », « Dimanche », etc.
archiveFileName Chemin d’accès à l’archivage. {#} change d’archive en archive.
archiveDateFormat Format de date par date de date d’archivage du nom du fichier.
maxArchiveFiles Spécifie le nombre de fichiers à archiver jusqu’à.

Il existe également des moyens d’archiver les méthodes non-date. Pour plus d’informations, consultez le site officiel.

Lorsqu’il est exécuté, il ressemble à ceci:

Envoyer des e-mails par journal

NLog vous permet également d’envoyer des e-mails lors de la connexion. Toutefois, si vous envoyez un e-mail tel qu’un journal de débogage, il deviendra trop à envoyer, C’est une bonne idée de ne cibler que des niveaux de journal limités, tels que Erreur et Fatal. En outre, pour éviter le risque de défaillance, comme le blocage du serveur de messagerie en raison de la transmission Nous vous recommandons de spécifier un compte de messagerie uniquement journal.

Ce qui suit est un exemple de configuration. Si vous souhaitez réellement envoyer du courrier, suivez le serveur SMTP que vous souhaitez utiliser.

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

Écrire des journaux à la base de données

NLog peut également écrire des journaux à la base de données. Ce qui suit est un exemple, donc s’il vous plaît se référer au site officiel pour plus de détails.

Cette section décrit les étapes à écrire à SQL Server sur un serveur différent.

Tout d’abord, créez une table pour vous connecter au serveur SQL cible. Puisque vous pouvez choisir la valeur à écrire, définissez ce dont vous avez besoin comme journal comme colonne.

Ce qui suit est un exemple de création de table 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

Une bibliothèque de clients de base de System.Data.SqlClient données est nécessaire pour le traitement des bases de données. Installons-le à partir de NuGet.

Écrit des informations de base de données à appsettings.json. nlog.config vous permet de charger les informations dans appsettings.json. Les paramètres sont provisoires, donc s’il vous plaît les définir en fonction de la base de données réelle. Le nom clé est arbitraire, mais est utilisé par nlog.config.

{
  "": "省略",

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

Définir nlog.config comme suit:

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

S’il n’y a pas d’erreurs à exécuter, il sera écrit comme suit :

Soit dit en passant.cs noter que tenter d’écrire des journaux à la base de données à un stade précoce, comme avant le programme .cs CreateHostBuilder méthodes, peut échouer.

Obtenez des enregistreurs de RequestServices et connectez-les

Il peut être fastidieux d’ajouter au constructeur chaque fois que vous créez ILogger un nouveau modèle de contrôleur ou de page. Alternativement, RequestServices vous pouvez obtenir de .

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

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

Si spécifier votre propre modèle de contrôleur ou de page est également lourd, vous pouvez créer des méthodes d’extension ou des classes de base.

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

Utiliser des cas

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

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