Sur l'enregistrement dans les applications ASP.NET M SK1Part 1...probablement)
Introduction
L’enregistrement est une partie critique des applications, mais je le vois souvent mal comprise / mal utilisé dans les applications ASP.NETM SK2 Il s’agit en partie d’un post et un manifesto sur la façon de s’inscrire efficacement à l’ASP
Il ne s’agit pas d’un guide complet pour l’enregistrement.
L’enregistrement principal devrait être USEFUL; qu’il soit l’enregistrement de ' pendant que vous travaillez à la mise au point ou en production, il doit être utile pour vous M SK3 votre équipe / vos utilisateurs.
Le problème
Il est trop souvent considéré que l’exploitation forestière ne se fait qu’au moment où il y a des exceptions.
LOGGING N'est pas seulement pour les exceptions
En général, vous devriez être en mesure de faire fonctionner localement une partie importante de votre application; dans ce contexte log.LogInformation est votre ami.
La solution
Succès de l'enregistrement
Au cours des 30 années, j’ai écrit le code IM SK2 j’avais vu quelques exemples de bon boisement et beaucoup plus d’exemples de mauvais boisement
Principes de bonne exploitation forestière:
- L’enregistrement dans le développement devrait fournir suffisamment d’information sur la façon dont votre application fonctionne pour comprendre ce qui se passe lorsque'
- L’enregistrement dans la production devrait vous donner un mécanisme super rapide et facile pour comprendre comment votre application échoue.
- L’immatriculation trop forte dans la production est négative; elle peut ralentir votre application et rendre plus difficile de trouver les choses importantes.
Rappelez-vous; que l'enregistrement ALWAYS traîne en bas la performance de votre application ; vous devriez enregistrer ce dont vous avez besoin pour diagnostiquer un problème mais pas plus dans la production M SK2 où la performance est critique (eMSC4g., ne pas faire un test de performance lorsque vous utilisez le Débug Loging intégral
Types d’enregistrement ASP.NET
Serilog vs Microsoft.Extensions.Logging
Dans ASP.NET vous avez déjà un système d'enregistrement structuré Microsoft.Extensions.Logging. Il s’agit d’un bon système de saisie de donnéesM SK1 mais il' n’est pas aussi souple que SerilogMSC3 Serilog est un système plus souple qui vous permet de saisir des données sur plusieurs puits ( sortiesMNK5 et d’enrichir vos registres avec des informations supplémentaires MNK6
Enregistrement de BootStrap
Il s’agit de l’enregistrement qui se produit lorsque votre application commence à fonctionner.
Par exemple, dans Serilog vous pouvez faire ceci:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/boot-*.txt", rollingInterval: RollingInterval.Day, retainedFileCountLimit: 7)
.CreateBootstrapLogger();
NOTE: Ceci est limité car vous n’avez pas accès à la configuration à ce moment-là. Par exemple, pour utiliser AppInsights vous #if RELEASE bloquer la clé appropriée .
Cela vous donne des données sur tout problème de démarrage dans votre application.
Vous 'Vous voudrez aussi emballer votre méthode de démarrage ( dans cette application J'utilise la nouvelle Program.cs méthode) dans un essaiM SK1 capter et enregistrer toutes les exceptions qui y se produisent
try
{
..all your startup code
}
catch (Exception ex)
{
if(args.Contains("migrate"))
{
Log.Information("Migration complete");
return;
}
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
Le Log.CloseAndFlush() est important car il permet de s'assurer que tous les logs sont écrits sur le disque ( Votre application est en panne, autrement elle sortira avant qu'elle ne le fasse.
Ici, je détecte également si l'application est en mode de migration et si oui, j'enregistre cette dernière et quitte.
Log.Fatal est le niveau de log le plus sévère; il ' est utilisé lorsque votre application est sur le point d’éclater
Les exceptions ne sont pas toutes fatales - vous devez utiliser Log.Error pour ceux (à moins qu’ils ne signifient que l’APP (et non la requête M SK2 ne peut pas se poursuivre au-delà de ce point
Niveaux de log
Dans l’ ASP.NET M SK1et .NET Plus généralement) vous avez un certain nombre de niveaux logs
Log.Fatal- Il s'agit du niveau de log le plus sévère ; il est utilisé ' lorsque votre application est sur le point d'éclaterLog.Error- Il s’agit d’une exception qui signifie que l’APP sans la demande M SK2 ne peut pas continuer au-delà de ce point .Log.Warning- Cette fonction est utilisée lorsque quelque chose survient qui n’est pas une erreur, mais que vous devez être au courant de ce qui se passe. non pas tout à fait mais pas une erreur).Log.Information- Ce fichier sert à fournir des renseignements généraux sur ce qui se passe dans votre application.Log.Debug- Il s’agit de l’information qui indique que ' est utile seulement lorsque vous effectuez des débuggings dans votre application
Pour la production, I'd établit généralement que l’embranchement doit être Log.Fatal, Log.Error et Log.Warning seulement.
Enregistrement du temps d'exécution
Contrairement à l’enregistrement du démarrage, c’est le signalement qui se produit lorsque votre application est en cours.
Par exemple, pour les utiliser dans Serilog vous'd faites ceci:
"Serilog": {
"Enrich": ["FromLogContext", "WithThreadId", "WithThreadName", "WithProcessId", "WithProcessName", "FromLogContext"],
"MinimumLevel": "Warning",
"WriteTo": [
{
"Name": "Seq",
"Args":
{
"serverUrl": "http://seq:5341",
"apiKey": ""
}
},
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/applog-.txt",
"rollingInterval": "Day"
}
}
],
"Properties": {
"ApplicationName": "mostlylucid"
}
},
Enrichissements
Comme vous le verrez, je suis un très grand fan de Serilog. Dans l'exemple ci-dessus, vous pouvez voir I'm enrichir mes logs avec le nom de threadM SK1 nom du thread , id et nom du processus de traitement. Cela peut être très utile pour diagnostiquer les problèmes dans votre applicationMSC4
J'ai également réglé l'enregistrement pour aller à plusieurs 'sinksM SK1 (outputs); dans ce cas, j'en envoie à la consoleMSC5 à un fichier et à Seq SSK6un service d'enregistrement
Il est pratique d’avoir plusieurs puits dans le cas où l’un de ceux-ci ne fonctionne pas., Dans ce cas, mon service d’enregistrement préféré est Seq.
J’ai également inscrit la propriété ApplicationName dans les logs; cela peut être utile si vous avez plusieurs applications qui se connectent au même service (que pour les applications distribuées vous aurez souventM SK2 avec une ID de corrélation pour lier les loges ensemble pour une seule demandeMSC3
Par exemple, si vous avez un front-end JS et un backend NET .NET, vous pouvez fixer l'ID de corrélation dans le front end et le transmettre à celui-ci.
Il y a une excellente couverture sur la façon dont vous pouvez le faire ici.
Enregistrement structuré
L’enregistrement structuré est un moyen d’enregistrement qui facilite la recherche et le filtrage de vos logs. Dans Serilog, vous pouvez le faire en utilisant Log.Information("This is a log message with {Property1} and {Property2}", property1, property2); syntax. Cela facilite la recherche de registres ayant une propriété particulière.
Enregistrement contextuel
En utilisant Serilog, vous pouvez également utiliser LogContext.PushProperty pour ajouter des propriétés à vos registres qui ne sont pertinentes qu'à un domaine particulier. Cela peut être très utile dans le diagnostic de problèmes dans votre application.
Établissement de Serilog
Serilog est super souple en ce qu'il vous permet de le configurer dans un code ainsi que par config. Par exemple, pour utiliser la configuration ci-dessus vous'd faites ce
builder.Host.UseSerilog((context, services, configuration) =>
{
configuration
.MinimumLevel.Warning()
.Enrich.FromLogContext()
.Enrich.WithThreadId()
.Enrich.WithThreadName()
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.WriteTo.Seq("http://seq:5341", apiKey: "")
.WriteTo.Console()
.WriteTo.File("logs/applog-.txt", rollingInterval: RollingInterval.Day)
.Enrich.WithProperty("ApplicationName", "mostlylucid");
});
Cela est le même que la configuration ci-dessus mais dans le code. C'est utile si vous voulez mettre en place votre enregistrement dans le Code; c'est ce qu'il appartient à vous de faire.
Filters d'exception
Dans ASP.NET, vous pouvez utiliser les filtres d'exception pour saisir des exceptions et les enregistrer. Toutefois, ce n’est pas le remplacement de l’enregistrement au niveau des méthodes. Vous devriez toujours vous inscrire à ce niveau afin que vous puissiez voir en détail ce qui se passe dans votre application.
Cela a changé dans ASP.NET Core 8 et làM SK2 est un ton que vous pouvez faire avec ces nouveautés.
De nouveau, les mêmes principes s'appliquent; vous devriez vous inscrire au niveau de la méthode pour que vous puissiez voir ce qui se passe dans votre application en détail.
DON'T LOG EVERYTHING IN PROD
L’enregistrement devrait être adapté à l’environnement; dans le développement, vous enregistrez tout pour que vous puissiez voir ce qui se passe à chaque point de votre application mais dans l’essai, vous avez besoin d’un enregistrement moins important M SK1 peut-être enregistrer des informations ici ) et dans la production, vous aurez encore besoin d'un inscription plus faible |(Avertissement et au-dessus de cette dernière
Il est tentant de consigner tout dans la production, mais ce n’est pas une bonne idée.
Pour une application très 'active' que vous venez de gagner, ' n’a pas besoin d’un suivi à long terme de ces données.
Demande d'enregistrement
Une fois que le problème courant que je vois dans la production est de consigner les demandes manquantes; alors qu’elles peuvent être intéressantes M SK1 personne ne veut un 404 / \401) il peut s’agir d’une énorme quantité de données et être très coûteux à stocker. Vous n’avez à enregistrer que des choses Vous avez l'intention de régler, pour un 404 il peut s'agir de ce qui est important parce qu'il peut indiquer un lien défectueux dans votre application; pour une \401 il pourrait être important parce que c'est possible d'indiquer un système d'authentification défecturé
Toutefois, comme je l’ai mentionné ci-dessus ces sont mieux gérés dans le code ils se produisent en fait dans (dans le cas de 401); il peut être que ces devraient aussi être enregistrés comme un Warning ou Error dans le code qui génère en fait le 401.
Pour configurer Request Logging in Serilog, vous pouvez faire ceci:
app.UseSerilogRequestLogging();
Cela affichera toutes les demandes à votre application; c’est une bonne façon de voir ce qui se passe dans votre application à un niveau élevé ; mais encore une fois, vous devriez être attentifs à ce que vous affichez et à la durée pendant laquelle vous conservez ces registres.
Pour Application Insights, vous pouvez toujours vous inscrire à l’aide du niveau d’information car cela vous donnera la fonctionnalité aisée User Journey; c’est une excellente façon de voir comment les utilisateurs utilisent votre application et peut être très utile pour diagnostiquer des problèmes ; mais encore ces coûts augmentent rapidement, donc vous devriez être prudent quant à ce que vous enregistrez et combien de temps vous conservez ces registres pour.
En conclusion
C’est ainsi qu’il s’agit d’un passage rapide sur la façon de s’enregistrer dans les applications ASP, ., NET et .. Une bonne partie est une réaction à des registres inutiles que je vois dans de nombreuses applications de production. Dans le développement, vous voulez voir Comment fonctionne l'application; dans la production que vous voulez voir comment l'application échoue. L’enregistrement est trop souvent inutile, partie coûteuse du développement d’applications. Comme c’est le cas pour tout ce qui concerne le développement de logiciels, l’enregistrement devrait être axé sur le utilisateurM SK2 que ce soit vous / autres développeurs en travaillant sur l’application dans votre IDE MSC4 localement ou en sortant rapidement et efficacement les problèmes de productionMNK5