¿Cómo debo manejar las fallas del registrador?

12

En varias de las aplicaciones de nuestra compañía, usamos un registrador personalizado. Es bastante robusto, aunque podemos reemplazarlo con algo como NLog en el futuro. Una de las tareas del registrador es registrar cualquier excepción encontrada en la aplicación.

Una de las preocupaciones que siempre he tenido es que el manejo de excepciones dentro del registrador permite una falla silenciosa. Es decir, si el registro no se escribe para una excepción determinada (debido a un error en el registrador), ¿cómo debo manejarlo y (de alguna manera) registrar la excepción en el registrador mismo ?

Digamos que la función WriteLog lanza una excepción. ¿Debo intentar llamar a la función varias veces o hasta que no se lance la excepción? ¿Debo tratar de escribir la excepción lanzada con el registrador (lo que probablemente resultaría en excepciones hasta el final ...?)? He tenido la suerte de no encontrar esta situación, excepto cuando estábamos implementando el registrador personalizado por primera vez. Por otro lado, no tengo forma de saber en este momento si el registrador no ha podido registrar las excepciones de la aplicación (debido a sus propias excepciones).

He intentado buscar en línea y en algunos sitios SE, pero hasta ahora ha sido infructuoso, ya que todas las publicaciones tratan los errores en un registrador (pero no las posibles excepciones y cómo registrarlos) o con excepciones fuera del registrador.

    
pregunta Zairja 12.12.2014 - 18:22

2 respuestas

17

Cuando encuentre excepciones dentro del propio registrador, no debe usar el registrador para registrar sus propias excepciones. La razón de esto es que:

  • Puedes quedarte atrapado en un bucle infinito. Imagine que dentro de su registrador, tiene una rama condicional que no fue probada (y genera una excepción). Imagine que una vez que se cumple la condición, cualquier otra excepción reportada es manejada por la misma rama. Esto significa que desde el momento en que se ejecuta la rama, estás en un bucle infinito.

  • Puede estar atrapado en un bucle temporal, generando miles de excepciones por segundo. Imagina que estás reportando excepciones a un servidor remoto. Un problema con el servidor causa otra excepción, que causa otra, y así sucesivamente, hasta que la conexión esté de vuelta.

Lo que debe hacer en su lugar es recurrir a una forma más segura de registrar las excepciones. Por ejemplo, si su registrador envía las excepciones a un servidor remoto, envíe las excepciones dentro del registrador a syslog en su lugar. Si su registrador registra excepciones en los eventos de Windows y esta acción falla, almacene la excepción de falla en un archivo de texto simple.

Una vez que tenga eso, la siguiente pregunta es cómo sabe que ocurrieron esas excepciones: si tiene docenas de aplicaciones ejecutándose en miles de servidores, no puede SSH cada uno de ellos regularmente para verificar si estaban registrar algo localmente.

Una forma es tener un trabajo cron que verifique esos "registros excepcionales" y los empuje a la ubicación donde se almacenan otras excepciones (eventualmente usando su registrador, ¡pero tenga cuidado con los bucles infinitos o temporales!).

    
respondido por el Arseni Mourzenko 12.12.2014 - 18:38
11

Si el registro es crítico para su aplicación, entonces uno debe detener la aplicación si falla el registro.

Si no es crítico, entonces ser algo defensivo podría tener un componente secundario para manejar las fallas de registro que registran / alertas a una fuente secundaria. Pero incluso eso no es infalible y tendrá que considerar qué sucede si el registrador secundario falla mientras está monitoreando el registrador primario.

Una buena estrategia es iniciar sesión en un archivo local y, si eso falla, tal vez registrar esa falla en el registro de eventos, generar una alerta de correo electrónico, guardar en una base de datos, etc. Con las estructuras de registro disponibles, esto debería ser infalible a menos que la máquina se queda sin espacio en disco o alguna otra condición rara.

Lo ideal sería que fueses mejor fallando en silencio, ya que eso hará que la aplicación sea menos compleja.

Y lo que es más importante, para manejar los errores de registro, uno debería estar monitoreando los registros de un tercero. Con el tiempo, debería poder discernir cuántos eventos está registrando una aplicación saludable. Si comienza a registrar eventos bajos o no se produce ningún evento, a través de la supervisión puede ver cómo ocurre el problema y, potencialmente, alertar a través de ese mecanismo de terceros.

    
respondido por el Jon Raynor 12.12.2014 - 19:48

Lea otras preguntas en las etiquetas