Comment dois-je gérer les pannes de l'enregistreur?

12

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.

Zairja
la source
5
Connectez-vous sur le fait stderrque votre support de sortie a échoué ou que «l'impossible» s'est produit.
Doval
1
Envoyez un e-mail aux développeurs ou affichez simplement l'erreur avec une adresse e-mail et laissez l'utilisateur copier et coller l'erreur.
Chloé

Réponses:

17

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 syslogplutô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!).

Arseni Mourzenko
la source
J'ai rencontré ce même problème avec mon enregistreur d'exceptions qui est allé à l'e-mail. S'il ne parvient pas à se connecter à un serveur, il entre dans une terrible boucle infinie. Au lieu de cela, j'ai mis un chèque en place pour renvoyer vers le journal des événements et empêcher l'envoi de nouveaux e-mails jusqu'à ce qu'une nouvelle connexion puisse être établie.
mgw854
Je pense que nous allons essayer de mettre en place un repli comme vous le suggérez. La suggestion de Jon Raynor d'arrêter l'application (dans une situation de journalisation critique) est également une que nous pourrions poursuivre et que nous n'avions pas envisagée.
Zairja
Que se passe-t-il si vous vous retrouvez avec des délais d'attente d'envoi vers Syslog ou des erreurs d'E / S lors de l'écriture dans un fichier? Vous pouvez encore aggraver le problème si les échecs sont dus à un réseau encombré ou à un manque d'espace disque. Ce n'est pas exactement une solution holistique; vous devez considérer la possibilité qu'il n'existe aucun moyen sûr de consigner les erreurs. Il n'est pas si dangereux de se connecter à son propre enregistreur tant que vous
intégrez la
11

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.

Jon Raynor
la source
1
+1 pour faire la distinction entre la journalisation critique et non critique, ainsi que pour noter l'importance du nombre de journaux par laps de temps. Je suis déçu de ne pas avoir pensé à ces deux aspects, alors que j'utilise la journalisation de secours depuis des années.
Arseni Mourzenko