Quelles sont les meilleures pratiques, y compris la journalisation à l'aide de log4net?
On m'a dit d'ajouter “enregistrement” de mon code à l'aide de log4net, le problème est que personne ne peut voyager dans le temps et voir ce que les problèmes du monde réel, l'enregistrement doivent être utilisées pour les résoudre.
Est donc là un ensemble de lignes directrices de toute façon à ce que pour ouvrir une session afin d'obtenir un raisonnable des coûts/bénéfices?
Donc:
Quels types de journalisation doit-on ajouter
pour une application qui serait utile
plus tard?
(Le code utilise beaucoup de WCF, un côté est en Winforms, de l'autre côté est un “serveur” qui normalement s'exécuter sur la même machine)
--
J'ai exception AJM réponses à faire de l'utile blog avec beaucoup de commentaires, il témoigne, mais si quelqu'un arrive avec une belle série de "règles de base" je suis susceptible de changer à la réponse attendue.
- Quelques réponses ci-dessous l'adresse de Ian principale question (qui je pense est une très bonne): quels sont les types de journalisation doit-on ajouter à une application qui serait utile plus tard? Assumer la journalisation du débogage. Il y a (je l'espère) un sweet spot, un terrain d'entente entre l'exploitation forestière chaque état unique, avec les valeurs de toutes les variables, et la journalisation des grands domaines fonctionnels de l'application. Quel est-il? Quels sont les types/exemples de l'exploitation forestière ont été utiles, à l'opposé d'junking le fichier de log?
- Je suppose qu'il devrait aller sans dire que si les services WCF sont déplacés vers d'autres serveurs, vous aurez deux ensembles de journaux pas un.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé cet article très utile: http://blog.codinghorror.com/the-problem-with-logging/
En particulier, je pense qu'une approche minimaliste est en effet la voie à suivre. Dans le passé, j'ai essayé de le journal de trop, mais cela gonfle le code
Aussi le fait de penser que le plus d'entrées du journal le mieux, c'est faux, car il gonfle les journaux eux-mêmes. Maintenant, je regarde mémorisations principal avantage de fournir un "point d'appui" ou un aperçu de ce qui se passe. Si plus de détail est nécessaire pour les zones alors ainsi soit-il, mais la position par défaut devrait être moins, c'est mieux
Une chose à garder à l'esprit est que, si votre configuration gérer les logs à différents niveaux, vous peut être la cause de lourds frais généraux dans votre journal des appels. Par exemple:
Ce sera bien évidemment le seul journal de l'objet, si vous avez un enregistreur d'écoute pour les journaux de DÉBOGAGE, cependant l'appel à construire l'objet XML sera exécuté quel que soit votre niveau d'enregistrement et pourrait causer d'importants ralentissements.
La solution correcte serait:
Mon préféré source d'information pour ce genre de question est Libérer - un livre de la Pragmatique, les gars. Très fortement recommandé.
Leur point de base en ce qui concerne votre question, c'est que l'enregistrement doit être orientée vers ce qui est nécessaire au niveau opérationnel. Les opérations de gars sont les plus concernés avec des choses exceptionnelles où le site peut être aller vers le bas (c'est à dire le pool de connexion est plein, la connexion à un serveur est en panne, etc.) Assurez-vous que les messages sont explicites et très claire de ce qu'est le problème, et le cas échéant ce que le correctif est. Écrire les messages pour la consommation humaine.
Je vois peu de point en fonction d'entrée/de sortie, le style des journaux. Les traces de pile pour haut-niveau pris exceptions sont utiles, l'exploitation forestière à des zones où plantage du système peut se produire (c'est à dire plein de pool de connexion) est utile, comme le fait de se connecter à des zones où le système s'est écrasé avant.
En général avec l'exploitation forestière-je ajouter de l'enregistrement dans l'ordre suivant:
Évidemment, je l'ai rarement l'occasion de la dernière, le premier est facile à faire si vous roulez votre propre wrapper pour log4net et utiliser l'élimination de modèle, et éventuellement un peu de réflexion de la magie.
Le 2ème se fait généralement lors de la réception/l'intégration et les tests de régression que les principaux flux logique et les zones de problèmes sont identifiés. L'ajout de la journalisation à ce stade est également assez minime comme vous le savez, en général, où vous devez ajouter autant que vous le débogage et de test.
Le 3e est généralement (pour moi de toute façon) ne le fait que dans les sections de code que l'expérience des régressions, ou sont particulièrement importantes.
J'ai mis en place une base objet wrapper pour log4net qui me donne direct des fonctionnalités de journalisation ainsi qu'un objet de contexte de qui peut être utilisé avec IDisposable pour envelopper "entrée/sortie" de la logique dans un joli convient paquet.
L'une des grandes choses au sujet de log4net est que vous pouvez enregistrer des événements à des catégories différentes. Les valeurs par défaut sont Debug, Info, d'Avertissement et d'Erreur. J'aime ces à dire
Debug - très prolixe, contient beaucoup d'informations de débogage. Par exemple, les requêtes SQL.
Info - l'information utile qui est bon à savoir.
Avertissement - rien de fatal, mais un opérateur doit être conscient du problème.
Erreur - l'application est instable, le journal contient des informations de diagnostic tels que le message de l'exception et de la trace de la pile.
L'utilisation de ces dans le code, si par exemple la
_log.Info("Updating object.");
serait d'écrire un niveau de l'INFO message à toute personne qui est intéressé.
Ensuite, vous pouvez raccorder des écouteurs dans la configuration à faire des choses avec le journal des messages. Voici celui que j'utilise:
Ce dit: tous les messages d'ERREUR de la console, tous les messages d'informations de l'enregistreur de données de l'Entrepôt.De base à la donnée de fichier.
Parce que ce câblage des catégories d'auditeurs est fait dans la configuration, vous pouvez modifier l'enregistrement après le déploiement. Il n'y a pratiquement pas de perte de performance pour l'enregistrement si rien ne l'écoute.
Concernant les coûts et les avantages de l'exploitation forestière y est certainement un sweet spot entre trop enregistrement (énorme journaux que personne ne pourra l'utiliser) et pas assez (une seule ligne qui dit "fail").
Ma politique est de vous connecter à l'INFO de ce qui pourrait échouer: dépendances externes (démarrage de l'application, les appels de service, les connexions SQL), et à DÉBOGUER le plus complexe des morceaux de viande (code de diagnostic messages dans une logique d'entreprise, individu appels SQL, certaines invocations de méthode).
Des situations inhabituelles où (par exemple) les valeurs par défaut sont prises qui ne sont pas habituellement aller pour l'AVERTIR, et les exceptions aller à l'ERREUR ou MORTELLES.
Aussi: garder à l'esprit que la WCF a une excellente visionneuse de trace de service qui vous permet de "descendre" pour les paquets individuels et la façon dont ils sont traités par les deux extrémités de la pile. Cela, aussi, est disponible en configuration sans modification de code. À cause de cela, je vais généralement juste faire très abrégée de la journalisation de la WCF service d'appels et de réponses.
L'enregistrement n'est pas une tâche facile, mais mon expérience est que tous les journaux devraient être consultables par les parties responsables. Une cible utile pour les erreurs sont l'e-mail directement (et dans certains cas, sms). Mais à la fin, toutes les données de journalisation doit être recherché dans une base de données avec un sesible de l'interface utilisateur.
Lorsque le courrier électronique est reçu à un compte spécifique, cela peut être traitées et mises dans la base de données directement. Il y a som catégories de manutention et les règles ci-dessous:
Le contenu de débogage peuvent être écrites dans la base de données de manière différente, mais nous avons besoin de concider la performance. Grande quantité de données ne doit pas être écrite à la base de données en "mode de production". Cela devrait être fait au quotidien/hebdomadaire bases. La meilleure façon est de produire un fichier local (tels que XML ou texte brut) et de placer ce fichier dans la base de données pendant les heures de maintenance (la nuit). Il devrait être possible de démarrer/arrêter une session de débogage et seulement écrire les informations de débogage à la base de données lors de la session de débogage est terminé.
Le débogage peut être mis en œuvre comme un WCF et log2net et directement accès à la base de données et/ou un magasin de fichiers local qui est mis dans la base de données sur une base régulière.
Une chose est claire...TOUTES les erreurs/exception doit être enregistré quelque part. Rien n'est plus irritant que de perte de messages d'erreur 🙂
Heureux de débogage!
Si vous lancer des exceptions à partir de vos propres classes d'exception, ou encore mieux, tous vos exception classes dérivent d'une classe de base, ajouter le niveau d'ERREUR à l'exploitation forestière (base) exception constructeur qui vous évite d'avoir à retenir sur chaque attraper/lancer. Utile si vous avez une grande base de code.
Pour le CLR ou 3ème partie des exceptions, journal d'Exception.ToString() et pas seulement le message, sinon vous manquez le plein de trace de pile (en supposant que les programmeurs ne sont pas avaler des exceptions ou re-jeter sans exception interne)
L'accent sur DEBUG détail dans les zones où vous savez ou soupçonnez que vous aurez des questions (il suffit de demander AQ ou le Soutien technique où chercher;-)
Si vous suivez les robustesse principe, alors vous pouvez vouloir INFO ou AVERTIR enregistrement lorsque vous l'ignorer ou de modifier les entrées, ou à un comportement attendu. Cela pourrait être utile si votre service WCF commence à recevoir inattendu (mais parseable) entrée.
Pour assurer que votre application s'exécute correctement, ne le navire/l'installer avec le niveau de DEBUG activé la journalisation par défaut, d'ERREUR ou d'AVERTIR est probablement la voie à suivre.
Je suis en désaccord avec la dernière partie de la accepté de répondre, parce que log4net a impressionnant de fonctionnalités de filtrage, à condition que vos programmeurs à comprendre que la connexion arrive à un coût (par CK réponse) et ils (et l'assurance qualité et Support technique) savoir sur les filtres, et que la configuration tout au DÉBOGAGE est une mauvaise idée. Si vous vous connectez au niveau de DÉBOGAGE d'un grand graphe d'objet, document xml, db résultat, et cetera, l'envelopper dans du code qui réduit les frais:
Je vous suggère de suivre le recommandé statique logger-p-approche de classe, tout simplement parce qu'il devrait faire de la journalisation des plus utiles lorsque vous avez fait à l'utiliser et à affiner sur un problème à l'aide de filtres, par exemple LoggerMatchFilter.
Si vous suivez cette approche et sont prêts prendre une (assez petits), de performances, voici une méthode qui utilise une trace de la pile pour créer ILog des objets pour toute la classe et d'assurer le fichier de config est programmé pour surveiller les changements:
Journal des événements dans l'observateur d'événements.
Utiliser à bon escient les INFOS de DEBUG d'AVERTISSEMENT et d'ERREUR.
lors de l'élaboration de tout montrer (utilisation de la console sur le côté serveur - voir ci-dessous) sur la production , le journal uniquement les erreurs (configurable)
- Je créer un enregistreur dans la mendicité de chaque classe en lui donnant la typeof(maclasse) mais c'est facultatif...
Je suis d'hébergement de la WCF dans DEV comme une application console - pour regarder le journal du serveur est facile aussi dans la console, mais une fois qu'il devient un service, vous devez utiliser l'observateur d'événements....
ah - et il est très rapide si on la compare à la WCF "temps d'appel" (l'appel du client vers le serveur), donc il n'a pas vraiment d'effet de votre temps, sauf si tu a quelque chose dans les journaux comme un fou (nHibernate par exemple) )
Il y a probablement une meilleure façon de le faire pour WCF; pour WinForms, vous pourriez envisager de regarder PostSharp. Cela vous permettra de journal des appels de méthode, sans encombrer votre code. Derrière les scènes que vous souhaitez toujours être à l'aide de l'excellent log4net.
Mise en garde: je n'ai pas utilisé moi-même; j'ai vu un très impressionnante présentation à un code de camp.