Dans plusieurs applications de notre entreprise, nous utilisons un enregistreur personnalisé. Il est assez robuste, bien que nous puissions le remplacer par quelque chose comme NLog à l'avenir. L'une des tâches de l'enregistreur consiste à consigner toutes les exceptions rencontrées dans l'application.
Une préoccupation que j'ai toujours eue est que la gestion des exceptions dans l'enregistreur permet une panne silencieuse. Autrement dit, si le journal n'est pas écrit pour une exception donnée (en raison d'une erreur dans l'enregistreur), comment dois-je le gérer et (en quelque sorte) enregistrer l'exception dans l'enregistreur lui - même ?
Disons que la fonction WriteLog lève une exception. Dois-je essayer d'appeler la fonction un certain nombre de fois ou jusqu'à ce que l'exception ne soit pas levée? Dois-je essayer d'écrire l'exception levée avec l'enregistreur (ce qui entraînerait probablement des exceptions tout le long ...)? J'ai eu la chance de ne pas rencontrer cette situation, sauf lors de la première mise en œuvre de l'enregistreur personnalisé. D'un autre côté, je n'ai aucun moyen de savoir pour le moment si l'enregistreur n'a pas réussi à enregistrer les exceptions d'application (en raison de ses propres exceptions).
J'ai essayé de rechercher en ligne et sur certains sites SE, mais jusqu'à présent, cela n'a pas porté ses fruits puisque tous les messages traitent des erreurs dans un enregistreur (mais pas des exceptions potentielles et comment les enregistrer) ou des exceptions en dehors de l'enregistreur.
stderr
que votre support de sortie a échoué ou que «l'impossible» s'est produit.Réponses:
Lorsque vous rencontrez des exceptions dans l'enregistreur lui-même, vous ne devez pas utiliser l'enregistreur pour enregistrer ses propres exceptions. La raison en est que:
Vous pouvez être coincé dans une boucle infinie. Imaginez que dans votre enregistreur, vous avez une branche conditionnelle qui n'a pas été testée (et génère une exception). Imaginez qu'une fois la condition remplie, toute autre exception signalée est gérée par la même branche. Cela signifie qu'à partir du moment où la branche est exécutée, vous êtes dans une boucle infinie.
Vous pouvez être bloqué dans une boucle temporaire, générant des milliers d'exceptions par seconde. Imaginez que vous signalez des exceptions à un serveur distant. Un problème avec le serveur provoque une autre exception, qui en provoque une autre, et ainsi de suite, jusqu'à ce que la connexion soit rétablie.
Ce que vous devez faire à la place est de recourir à un moyen plus sûr de consigner les exceptions. Par exemple, si votre enregistreur envoie les exceptions à un serveur distant, envoyez
syslog
plutôt les exceptions dans l'enregistreur à . Si votre enregistreur enregistre des exceptions dans les événements Windows et que cette action échoue, stockez l'exception d'échec dans un fichier texte simple.Une fois que vous avez cela, la question suivante est de savoir comment savez-vous que ces exceptions se sont produites: si vous avez des dizaines d'applications en cours d'exécution sur des milliers de serveurs, vous ne pouvez pas éventuellement SSH chacun d'eux régulièrement pour vérifier s'ils enregistraient quelque chose localement .
Une façon est d'avoir un travail cron qui vérifie ces «journaux exceptionnels» et les pousse à l'emplacement où d'autres exceptions sont stockées (éventuellement en utilisant votre enregistreur, mais méfiez-vous des boucles infinies ou temporaires!).
la source
Si la journalisation est critique pour votre application, alors il faut arrêter l'application si la journalisation échoue.
Si ce n'est pas critique, le fait d'être quelque peu défensif pourrait avoir un composant secondaire pour gérer les échecs de journalisation qui consigne / alerte une source secondaire. Mais même cela n'est pas infaillible et vous devrez considérer ce qui se passe si l'enregistreur secondaire tombe en panne pendant qu'il surveille l'enregistreur principal.
Une bonne stratégie consiste à se connecter à un fichier local et en cas d'échec, peut-être à enregistrer cet échec dans le journal des événements, à générer une alerte par e-mail, à enregistrer dans une base de données, etc. de l'espace disque ou d'une autre condition rare.
Idéalement, il vaut mieux échouer silencieusement car cela rendrait l'application moins complexe.
Plus important encore, pour gérer les échecs de journalisation, il convient de surveiller les journaux d'un tiers. Au fil du temps, vous devriez pouvoir discerner le nombre d'événements qu'une application saine enregistre. S'il commence à enregistrer des événements faibles ou inexistants, alors grâce à la surveillance, vous pouvez voir le problème se produire et potentiellement alerter via ce mécanisme tiers.
la source