2009-04-19 13 views
6

¿Hay una biblioteca o una forma fácil de detectar excepciones lanzadas en un programa de Ruby y registrarlas en un archivo? Miré más de log4r y logger, pero los documentos de ambos no proporcionan ningún ejemplo de cómo haría esto. Ejecuto este programa de forma remota y pierdo identificadores para stdout y stderr, si esa información ayuda en absoluto.Excepciones de registro automático en Ruby

¿Qué recomendarías?

Respuesta

14

Si desea dar un paseo por el lado salvaje, intente esto:

class Exception 
    alias real_init initialize 
    def initialize(*args) 
    real_init *args 
    # log the error (self) or its args here 
    end 
end 

Este interceptará la creación de nuevos objetos de excepción en el momento de la creación.

+1

Gracias Markus! Si el lado salvaje funciona, ¡estoy más que dispuesto a caminar! –

+0

upvoted para la creatividad! –

+4

Esto es divertido, pero sería muy cuidadoso con la excepción de parcheo. –

4

Rescate de Exception. Algo como esto probablemente tiene sentido:

begin 
    # run your code here .. 
rescue Exception => exception 
    # logger.error(...) .... 
    raise exception 
end 

Esto registrará la excepción, y volver a levantarlo para que la aplicación genera un error de hecho, además de la tala.

exception es una instancia de Exception, echar un vistazo a the docs para obtener información sobre lo que puede hacer con este objeto (como el acceso a la traza inversa).

+1

Hmm, eso es lo que temía tener que hacer. El código involucrado es básicamente una clase con una cantidad de métodos; ¿Tendría que poner un comienzo/rescate en cada método o hay una manera más fácil? –

+0

Probablemente esté creando instancias en alguna parte: coloque el bloque de rescate donde crea las instancias. –

+0

Ponerlo en el código de creación de instancia no servirá de nada a menos que el error esté en la creación. Si quiere detectar cualquier error, globalmente, envuelva su cuerpo principal. – MarkusQ

2

Si está ejecutando una aplicación de Rails, el complemento Exception Notification es muy útil.

+0

Ah sí, definitivamente lo he visto, pero mi aplicación en cuestión no es una aplicación de Rails. ¡Gracias! –

0

¿funcionaría si hice algo como esto:

begin 
    main() 
rescue Exception => e 
    myCustomErrorLogger(e) 
end 

def main() 
    # All the application code comes here. 
end 

Lo que necesito es tener todos mis excepciones no capturadas se mueven al nivel más superior, y ser atrapados allí y posteriormente registrados por el registro de errores función.

Estoy probando esto ahora, pero sería genial tener sus sugerencias.

0

Puede ajustar el código de la clase Excepción en la parte que pone a stdout el motivo y la traza inversa.

No se olvide de comprobar si el registrador puede ser nulo, la excepción se puede lanzar antes (o mientras) el registrador se creó.

Cuestiones relacionadas