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