Comment puis-je "redémarrer" par programme une application Android?

.net – Meilleures pratiques de journalisation

Mise à jour: pour les extensions de System.Diagnostics, fournissant certains des écouteurs manquants souhaités, voir Essential.Diagnostics sur CodePlex (http://essentialdiagnostics.codeplex.com/)

Cadres

Q: Quels cadres utilisez-vous?

A: System.Diagnostics.TraceSource, intégré à .NET 2.0.

Il fournit une journalisation puissante, flexible et hautes performances pour les applications, mais de nombreux développeurs ne sont pas conscients de ses fonctionnalités et ne les exploitent pas pleinement.

Des fonctionnalités supplémentaires sont parfois utiles, voire inexistantes dans certains cas. Toutefois, cela ne signifie pas que tout le cadre de journalisation (conçu pour être extensible) doit être jeté et complètement remplacé, comme certaines alternatives populaires. (NLog, log4net, Common.Logging et même la journalisation EntLib).

Plutôt que de modifier la façon dont vous ajoutez des instructions de journalisation à votre application et réinventez la roue, vous venez d'étendre le cadre System.Diagnostics aux seuls endroits où vous en avez besoin.

Il me semble que les autres frameworks, même EntLib, souffrent tout simplement du syndrome Not Invented Here, et je pense qu’ils ont perdu du temps à réinventer les bases qui fonctionnent déjà parfaitement dans System.Diagnostics (comme la façon dont vous écrivez des instructions de journal), plutôt que de combler les quelques lacunes qui existent. En bref, ne les utilisez pas, ils ne sont pas nécessaires.

Caractéristiques que vous n'avez peut-être pas connues:

  • L'utilisation des surcharges TraceEvent qui prennent une chaîne de format et des arguments peut améliorer les performances, car les paramètres sont conservés en tant que références distinctes jusqu'à la fin du processus Filter.ShouldTrace (). Cela signifie qu'aucun appel coûteux à ToString () sur les valeurs de paramètre jusqu'à ce que le système ait confirmé que le message sera réellement enregistré.
  • Trace.CorrelationManager vous permet de corréler des instructions de journal relatives à la même opération logique (voir ci-dessous).
  • VisualBasic.Logging.FileLogTraceListener est idéal pour l'écriture dans les fichiers journaux et prend en charge la rotation de fichier. Bien que dans l'espace de noms VisualBasic, il peut être utilisé aussi facilement dans un projet C # (ou dans un autre langage) en incluant simplement la DLL.
  • Lorsque vous utilisez EventLogTraceListener si vous appelez TraceEvent avec plusieurs arguments et avec une chaîne de format vide ou null, les arguments sont directement transmis à EventLog.WriteEntry () si vous utilisez des ressources de message localisées.
  • L'outil Service Trace Viewer (de WCF) est utile pour afficher les graphiques des fichiers journaux en corrélation d'activité (même si vous n'utilisez pas WCF). Cela peut vraiment aider à déboguer des problèmes complexes impliquant plusieurs threads / activités.
  • Évitez les frais généraux en effaçant tous les écouteurs (ou en supprimant le paramètre Par défaut); sinon, Default transmettra tout au système de trace (et entraînera tous les frais généraux de ToString ()).

Zones que vous pourriez envisager d'étendre (si nécessaire):

  • Écouteur de trace de base de données
  • Écouteur de trace de console colorée
  • Écouteurs de trace MSMQ / Email / WMI (si nécessaire)
  • Implémenter un FileSystemWatcher pour appeler Trace.Refresh pour les changements de configuration dynamiques

Autres recommandations:

Utilisez des identifiants d’événements structurés et conservez une liste de références (par exemple, documentez-les dans un enum).

Avoir des identifiants d’événement uniques pour chaque événement (significatif) de votre système est très utile pour corréler et rechercher des problèmes spécifiques. Il est facile de retrouver le code spécifique qui enregistre / utilise les identifiants d’événement et facilite la fourniture de conseils pour les erreurs courantes, par exemple. erreur 5178 signifie que la chaîne de connexion à la base de données est incorrecte, etc.

Les identifiants d'événement doivent suivre une sorte de structure (similaire à la théorie des codes de réponse utilisée dans les e-mails et HTTP), qui vous permet de les traiter par catégorie sans connaître de codes spécifiques.

par exemple. Le premier chiffre peut détailler la classe générale: 1xxx peut être utilisé pour les opérations «Démarrer», 2xxx pour un comportement normal, 3xxx pour le traçage d'activité, 4xxx pour les avertissements, 5xxx pour les erreurs, 8xxx pour les opérations «Stop», 9xxx pour les erreurs fatales, etc. .

Le deuxième chiffre peut détailler la zone, par exemple 21xx pour les informations de base de données (41xx pour les avertissements de base de données, 51xx pour les erreurs de base de données), 22xx pour le mode de calcul (42xx pour les avertissements de calcul, etc.), 23xx pour un autre module, etc.

Les identifiants d’événement assignés et structurés vous permettent également de les utiliser dans des filtres.

Q: Si vous utilisez le traçage, utilisez-vous Trace.Correlation.StartLogicalOperation?

R: Trace.CorrelationManager est très utile pour corréler les instructions de journal dans n’importe quel environnement multithread (ce qui est pratiquement tout ce que nous connaissons actuellement).

Vous devez au moins définir le ActivityId une fois pour chaque opération logique afin de corréler.

Start / Stop et LogicalOperationStack peuvent ensuite être utilisés pour un contexte simple basé sur une pile. Pour des contextes plus complexes (opérations asynchrones, par exemple), l’utilisation de TraceTransfer vers le nouvel ActivityId (avant de le changer) permet la corrélation.

L'outil Service Trace Viewer peut être utile pour afficher des graphiques d'activité (même si vous n'utilisez pas WCF).

Q: Écrivez-vous ce code manuellement ou utilisez-vous une forme de programmation orientée aspect pour le faire? Voulez-vous partager un extrait de code?

A: Vous pouvez créer une classe de portée, par exemple. LogicalOperationScope, qui (a) configure le contexte lors de la création et (b) le réinitialise lors de la suppression.

Cela vous permet d'écrire du code tel que le suivant pour boucler automatiquement les opérations:

using (LogicalOperationScope operation = new LogicalOperationScope ("Operation"))
  {
    // .. travaille ici
  }

Lors de la création, l'étendue peut tout d'abord définir ActivityId si nécessaire, appelez StartLogicalOperation, puis enregistrez un message TraceEventType.Start. Sur Dispose, il peut enregistrer un message Stop, puis appeler StopLogicalOperation.

Q: Fournissez-vous une forme de granularité sur les sources de trace? Par exemple, WPF TraceSources vous permet de les configurer à différents niveaux.

R: Oui, plusieurs sources de trace sont utiles / importantes à mesure que les systèmes s'agrandissent.

Bien que vous souhaitiez probablement consigner de manière cohérente tous les messages Avertissement & Au-dessus, ou Tous les informations & Au-dessus, pour tout système de taille raisonnable, le volume du traçage des activités (démarrage, arrêt, etc.) et de la journalisation détaillée devient trop important.

Plutôt que de n'avoir qu'un seul commutateur activant ou désactivant le tout, il est utile de pouvoir activer ces informations pour une section de votre système à la fois.

De cette façon, vous pouvez localiser les problèmes importants dans la journalisation habituelle (tous les avertissements, erreurs, etc.), puis effectuer un zoom avant sur les sections souhaitées et les définir sur les niveaux de suivi des activités ou même de débogage.

Le nombre de sources de trace dont vous avez besoin dépend de votre application, par exemple. vous souhaiterez peut-être une source de trace par assemblage ou par section principale de votre application.

Si vous avez besoin d'un contrôle encore plus précis, ajoutez des commutateurs booléens individuels pour activer / désactiver le traçage spécifique de volume élevé, par exemple. messages bruts. (Vous pouvez également utiliser une source de trace distincte, similaire à WCF / WPF).

Vous pouvez également envisager d’examiner différentes sources de trace pour la journalisation d’activité par rapport à la journalisation générale (autre), car cela peut faciliter la configuration des filtres à votre guise.

Notez que les messages peuvent toujours être corrélés via ActivityId même si différentes sources sont utilisées. Vous devez donc en utiliser autant que vous en avez besoin.

Les auditeurs

Q: Quelles sorties de journal utilisez-vous?

Cela peut dépendre du type d'application que vous écrivez et des éléments en cours de journalisation. Habituellement, des choses différentes vont à des endroits différents (c'est-à-dire des sorties multiples).

Je classe généralement les sorties en trois groupes:

(1) Événements – Journal des événements Windows (et fichiers de trace)

par exemple. Si vous écrivez un serveur / service, la meilleure pratique sous Windows consiste à utiliser le journal des événements Windows (vous ne disposez pas d'une interface utilisateur à laquelle signaler).

Dans ce cas, tous les événements Fatal, Error, Warning et (au niveau du service) doivent être enregistrés dans le journal des événements Windows. Le niveau d'informations doit être réservé à ce type d'événements de haut niveau, ceux que vous souhaitez inclure dans le journal des événements, par exemple. "Service démarré", "Service arrêté", "Connecté à Xyz", et peut-être même "Calendrier lancé", "Utilisateur connecté", etc.

Dans certains cas, vous voudrez peut-être que l’écriture dans le journal des événements devienne une partie intégrante de votre application et non via le système de trace (c’est-à-dire, écrivez directement les entrées du journal des événements). Cela signifie qu'il ne peut pas être désactivé accidentellement. (Notez que vous souhaitez toujours noter le même événement dans votre système de trace afin que vous puissiez effectuer une corrélation).

En revanche, une application graphique Windows les signale généralement à l'utilisateur (bien qu'ils puissent également se connecter au journal des événements Windows).

Les événements peuvent également avoir des compteurs de performance associés (par exemple nombre d'erreurs / s), et il peut être important de coordonner toute écriture directe dans le journal des événements, les compteurs de performance, l'écriture dans le système de trace et la génération de rapports vers l'utilisateur afin qu'elles se produisent à le même temps.

En d'autres termes, si un utilisateur voit un message d'erreur à un moment donné, vous devriez pouvoir trouver le même message d'erreur dans le journal des événements Windows, puis le même événement avec le même horodatage dans le journal de trace (avec d'autres détails de trace).

(2) Activités – Fichiers journaux d’application ou table de base de données (et fichiers de trace)

C’est l’activité courante d’un système, par exemple: page Web desservie, négociation boursière, ordre pris, calcul effectué, etc.

Le traçage des activités (démarrer, arrêter, etc.) est utile ici (à la bonne granularité).

En outre, il est très courant d'utiliser un journal d'application spécifique (parfois appelé journal d'audit). Il s’agit généralement d’une table de base de données ou d’un fichier journal d’application contenant des données structurées (c’est-à-dire un ensemble de champs).

Les choses peuvent devenir un peu floues en fonction de votre application. Un bon exemple pourrait être un serveur Web qui écrit chaque demande dans un journal Web; Des exemples similaires peuvent être un système de messagerie ou un système de calcul où chaque opération est consignée avec les détails spécifiques à l’application.

Les opérations sur les marchés boursiers ou un système de commande client en sont un exemple moins bon. Dans ces systèmes, vous enregistrez probablement déjà l'activité car ils ont une valeur commerciale importante, mais le principe de leur corrélation avec d'autres actions est toujours important.

En plus des journaux d’applications personnalisés, les activités ont souvent des compteurs de performance associés, par ex. nombre de transactions par seconde.

En règle générale, vous devez coordonner la journalisation des activités sur différents systèmes, c’est-à-dire écrire dans votre journal d’application en même temps que vous augmentez votre compteur de performance et ouvrez une session sur votre système de trace. Si vous le faites tous en même temps (ou l'un après l'autre dans le code), les problèmes de débogage sont plus faciles (que s'ils se produisent tous à des moments / emplacements différents dans le code).

(3) Trace de débogage – Fichier texte, ou peut-être XML ou base de données.

Ces informations sont au niveau Verbose et inférieur (par exemple, des commutateurs booléens personnalisés pour activer / désactiver les vidages de données brutes). Ceci fournit les entrailles ou les détails de ce qu’un système fait au niveau de la sous-activité.

C'est le niveau que vous voulez pouvoir activer / désactiver pour des sections individuelles de votre application (d'où les multiples sources). Vous ne voulez pas que ces choses encombrent le journal des événements Windows. Parfois, une base de données est utilisée, mais il est plus probable que les fichiers journaux générés soient purgés après un certain temps.

Une grande différence entre ces informations et un fichier journal d'application est que ces informations ne sont pas structurées. Alors qu'un journal d'application peut contenir des champs pour To, From, Amount, etc., les traces de débogage Verbose peuvent être ce que le programmeur insère, par exemple. "vérification des valeurs X = {valeur}, Y = false", ou des commentaires / marqueurs aléatoires du type "Terminé, en essayant à nouveau".

Une pratique importante consiste à vous assurer que les éléments que vous insérez dans les fichiers journaux des applications ou dans le journal des événements Windows sont également consignés dans le système de trace avec les mêmes détails (par exemple, horodatage). Cela vous permet ensuite de corréler les différents journaux lors de la recherche.

Si vous envisagez d’utiliser un visualiseur de journal particulier en raison d’une corrélation complexe, par exemple, dans Service Trace Viewer, vous devez utiliser un format approprié, à savoir XML. Sinon, un simple fichier texte est généralement suffisant. Aux niveaux inférieurs, les informations sont en grande partie non structurées. Vous pouvez donc trouver des dumps de tableaux, des dumps de pile, etc. À condition que vous puissiez corréler à des journaux plus structurés à des niveaux supérieurs, va bien.

Q: Si vous utilisez des fichiers, utilisez-vous des journaux de roulement ou un seul fichier? Comment mettez-vous les journaux à la disposition des gens?

R: Pour les fichiers, vous souhaitez généralement faire défiler les fichiers journaux d'un point de vue facilité de gestion (avec System.Diagnostics, utilisez simplement VisualBasic.Logging.FileLogTraceListener).

La disponibilité à nouveau dépend du système. Si vous ne parlez que de fichiers, pour un serveur / service, vous pouvez uniquement accéder aux fichiers en défilement lorsque cela est nécessaire. (Le journal des événements Windows ou les journaux des applications de base de données auraient leurs propres mécanismes d’accès).

Si vous n’avez pas un accès facile au système de fichiers, le traçage de débogage vers une base de données peut être plus facile. (c'est-à-dire implémenter une base de données TraceListener).

Une solution intéressante que j’ai vue pour une application graphique Windows était qu’elle enregistrait des informations de traçage très détaillées sur un "enregistreur de vol" en cours d’exécution, puis lorsque vous l’arrêtiez s’il n’y avait aucun problème, il supprimait simplement le fichier.

Si, toutefois, il se bloquait ou rencontrait un problème, le fichier n'était pas supprimé. S’il détecte l’erreur ou lorsqu’il s'exécutera ultérieurement, il remarquera le fichier et pourra agir, par exemple. comprimez-le (par exemple 7zip) et envoyez-le par courrier électronique ou rendez-le disponible.

De nos jours, de nombreux systèmes intègrent la notification automatisée des défaillances à un serveur central (après vérification auprès des utilisateurs, par exemple pour des raisons de confidentialité).

Visualisation

Q: Quels outils utilisez-vous pour afficher les journaux?

R: Si vous avez plusieurs journaux pour différentes raisons, vous utiliserez plusieurs visualiseurs.

Notepad / vi / Notepad ++ ou tout autre éditeur de texte est la base des journaux de texte brut.

Si vous avez des opérations complexes, par exemple Pour les activités avec transferts, vous utiliseriez évidemment un outil spécialisé tel que le visualiseur de trace de service. (Mais si vous n'en avez pas besoin, un éditeur de texte est plus facile).

Comme je consigne généralement des informations de haut niveau dans le journal des événements Windows, cela fournit un moyen rapide d'obtenir une vue d'ensemble structurée (recherchez les jolies icônes d'erreur / d'avertissement). Vous ne devez commencer à parcourir les fichiers texte que s’il n’y en a pas assez dans le journal, même si au moins le journal vous donne un point de départ. (À ce stade, il est utile de s’assurer que vos journaux ont des ententes coordonnées).

Généralement, le journal des événements Windows met également ces événements importants à la disposition d'outils de surveillance tels que MOM ou OpenView.

Autres —

Si vous vous connectez à une base de données, il peut être facile de filtrer et de trier les informations (par exemple, zoomez sur un identifiant d'activité particulier. (Avec des fichiers texte, vous pouvez utiliser Grep / PowerShell ou similaire pour filtrer sur le GUID particulier que vous voulez).

MS Excel (ou un autre tableur). Cela peut être utile pour analyser des informations structurées ou semi-structurées si vous pouvez les importer avec les bons délimiteurs de sorte que différentes valeurs soient placées dans des colonnes différentes.

Lors de l’exécution d’un service dans debug / test, j’héberge généralement ce dernier dans une application console par souci de simplicité. Je trouve un consignateur de consoles coloré utile (par exemple, rouge pour les erreurs, jaune pour les avertissements, etc.). Vous devez implémenter un écouteur de trace personnalisé.

Notez que la structure n'inclut pas de consignateur couleur de la console ni de consignateur de base de données. Vous devez donc les écrire si vous en avez besoin (ce n'est pas trop difficile).

Cela me gêne vraiment que plusieurs frameworks (log4net, EntLib, etc.) aient perdu du temps à réinventer la roue et à réimplémenter la journalisation, le filtrage et la journalisation de base des fichiers texte, du journal des événements Windows et des fichiers XML, chacun dans son propre manière différente (les instructions du journal sont différentes dans chacune); chacun a ensuite mis en œuvre sa propre version, par exemple d'un enregistreur de base de données, alors que la plupart de ces éléments existaient déjà et qu'il suffisait de quelques écouteurs de trace supplémentaires pour System.Diagnostics. Parlez d'un gros gaspillage d'effort en double.

Q: Si vous construisez une solution ASP.NET, utilisez-vous également la surveillance de l'état de santé ASP.NET? Incluez-vous la sortie de trace dans les événements du moniteur d'intégrité? Qu'en est-il de Trace.axd?

Ces choses peuvent être activées / désactivées au besoin. Trace.axd me semble très utile pour déboguer la façon dont un serveur réagit à certaines choses, mais ce n'est généralement pas utile dans un environnement très utilisé ou pour un traçage à long terme.

Q: Qu'en est-il des compteurs de performance personnalisés?

Pour une application professionnelle, en particulier un serveur / service, je m'attends à ce qu'elle soit entièrement instrumentée avec les deux compteurs Analyseur de performances et la journalisation dans le journal des événements Windows. Ce sont les outils standard de Windows et doivent être utilisés.

Vous devez vous assurer d'inclure les programmes d'installation pour les compteurs de performance et les journaux des événements que vous utilisez. ceux-ci doivent être créés au moment de l'installation (lors de l'installation en tant qu'administrateur). Lorsque votre application s'exécute normalement, elle ne doit pas nécessairement disposer de privilèges d'administration (et ne pourra donc pas créer de journaux manquants).

C’est une bonne raison de vous entraîner à développer en tant que non-administrateur (créez un compte administrateur distinct lorsque vous devez installer des services, etc.). Si vous écrivez dans le journal des événements, .NET créera automatiquement un journal manquant la première fois que vous l'écrivez. si vous développez en tant qu'administrateur, vous vous en apercevrez de bonne heure et vous éviterez la mauvaise surprise lorsqu'un client installe votre système. Il ne peut plus l'utiliser car il ne s'exécute pas en tant qu'administrateur.

Posts created 16707

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Articles similaires

Commencez à saisir votre recherche ci-dessus et pressez Entrée pour rechercher. ESC pour annuler.