Quelle est la meilleure façon d'écrire les entrées du journal des événements?
J'ai récemment eu un problème lors du déploiement d'un service windows. Quatre ordinateurs ne cause pas de problèmes, mais sur le cinquième de toute tentative de démarrer le service a échoué en raison d'une exception. La trace de pile d'exception est écrit dans le journal des événements, j'ai donc bien qu'il devrait être facile à identifier la cause:
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("Starting service", EventLogEntryType.Information);
try
{
//...
base.OnStart(args);
}
catch (Exception ex)
{
EventLog.WriteEntry("Service can not start. Stack trace:" + ex.StackTrace, EventLogEntryType.Error);
Stop();
return;
}
EventLog.WriteEntry("Service started", EventLogEntryType.Information);
}
Mais hélas, aucune information n'a jamais été écrit dans le journal. J'ai enfin tracée à la première entrée du journal en cours d'écriture. Il a jeté une exception parce que le journal des événements d'application était plein avec des entrées récentes, et configurée pour remplacer uniquement les entrées âgés de plus de 7 jours.
Quelles sont les meilleures pratiques sur l'écriture dans le journal des événements, considérant que je ne peux pas modifier la configuration du journal des événements d'application?
Dois-je toujours mettre EventLog.WriteEntry
dans un bloc try, si oui, comment dois-je traiter l'exception (l'écrire dans le journal des événements est probablement une mauvaise idée), dois-je vérifier le journal des événements d'état dans mon OnStart
méthode, ou avez-vous une meilleure suggestion?
source d'informationauteur Treb
Vous devez vous connecter pour publier un commentaire.
Je pense que la journalisation des exceptions est l'un des rares cas où vous êtes mieux d'avaler de l'exception. Dans la plupart des cas, vous ne voulez pas que votre application à l'échec.
Mais pourquoi écrivez-vous de votre code d'enregistrement vous-même? L'utilisation d'un framework comme NLog ou Log4Net! Ces avaler des exceptions comme je viens de le dire, mais vous pouvez rediriger la sortie d'enregistrement à un autre emplacement (fichier, messagebox etc.) avec juste un changement de configuration. Cela rend la résolution de problèmes comme cela beaucoup plus facile.
Utilisation log4net
L'avantage de l'utilisation de log4net est que vous pouvez vérifier l'enregistrement et de le contrôler avec beaucoup plus de souplesse que vous représenteront au sein de votre code.
Si vous avez été la journalisation dans le journal des événements, et de voir les problèmes et pas d'entrées de journal des événements, vous pourriez toujours avoir passé à un fichier-appender journal et ont vu de travail... ce qui aurait alors dit qu'il avait quelque chose à voir avec le journal des événements.
log4net est également sur la défensive, il ne sera pas le plantage de votre programme s'il ne parvient pas à écrire l'entrée de journal. Donc, vous n'auriez pas vu cela se produire (de sorte que vous n'avez pas vos fichiers journaux, mais votre programme devrait être en cours d'exécution et, de nouveau, vous pourriez avoir spécifié un deuxième méthode de journalisation pour obtenir les fichiers journaux).
Le plus important dans la log4net de la documentation est-ce:
(mon emphase)
Pour la plupart des choses, il y a une bibliothèque qui le fait mieux que vous. La meilleure chose est de ne jamais ré-inventer, log4net résout connexion .Net et rendra votre vie plus facile.
Cela devrait résoudre votre problème de débordement. Le journal des événements est généralement très fiable, une fois qu'il est configuré correctement. Lors de l'utilisation du journal des événements, j'ai utilisé pour ajouter rapidement une sauvegarde d'urgence enregistreur de frappe qui a simplement écrit dans un fichier texte (cela prend environ 5 minutes pour écrire). Ça n'a jamais été appelé.
Tu ne peux pas utiliser la valeur par défaut de l'événement-journal du mécanisme que la classe ServiceBase fournit déjà? Si votre service ne démarre pas automatiquement écrire une entrée dans le journal des événements affiche (avec stacktrace).
En dehors de cela, et concernant les commentaires à propos de log4net (ou tout autre best-effort comme la journalisation du système), je pense que ça dépend vraiment de ce que vous essayez d'atteindre.
Dans votre exemple, à l'aide de log4net (ou la prise en charge intégrée pour eventlogging de ServiceBase) est probablement OK.
Cependant, il existe des situations où même le fait qu'une erreur s'est produite et que ce fait n'a pas pu être enregistré quelque part un problème. Supposons, par exemple, une authentification ou le système d'autorisation. Si vous ne pouvez pas correctement et de manière fiable journal qui a, disons, le mot de passe d'authentification a échoué en raison de mauvaises informations d'identification, vous êtes peut-être pas permis de continuer (même si BTW, si vous le mot de passe d'authentification aurait été couronnée de succès).
Donc, parfois, vous avez besoin de savoir quand un enregistrement tentative a échoué et la poignée que par lui-même.
Il y a des limites à ce cours (poulet-oeuf-problème), et ce que vous faites est très spécifique à l'application ou du scénario.
Look en utilisant le La Journalisation De L'Application Bloc.
Prenons un peu de recul ici:
Le journal des événements système est là pour alerter l'administrateur système qu'il y avait un problème avec quelque chose sur le système. Vous devez autoriser le démarrage du service à l'échec. Cela apparaîtra dans le journal d'erreurs système avec une source de "Gestionnaire de Contrôle de Service". Cela signifie que le sys admin va savoir à propos de la panne.
Ensuite, si vous avez besoin du dépannage ensuite, vous devez vous connecter exceptions à un fichier sur le disque à haut niveau de votre programme. Vous devez également renvoyer afin que le service de démarrage échoue.
Vous pouvez ensuite identifier les problèmes dans les journaux des événements système et de la croix de référence de l'échec dans vos journaux d'application.