2008-10-23 20 views
34

Estoy trabajando en el proyecto de rieles y estoy tratando de obtener excepciones para que se registren en los archivos de registro de rieles. Sé que puedo llamar al logger.error $! para obtener la primera línea de la excepción registrada en el archivo. Pero, también quiero que se registre toda la pila de seguimiento. ¿Cómo registro el seguimiento completo de una excepción usando el registrador de rieles predeterminado?¿Cómo registro el seguimiento completo de una excepción de Ruby usando el registrador Rails predeterminado?

Respuesta

38
logger.error $!.backtrace 

Además, no se olvide que puede

rescue ErrorType => error_name 

para darle a su error de un nombre de variable distinta de la predeterminada $!.

+1

¿Echo de menos algo? logger.error solo toma un solo argumento, por lo que el código no funciona ... –

+19

Éste no funciona, use 'logger.error e.message +" \ n "+ e.backtrace.join (" \ n ") 'en su lugar. –

+3

Podría jurar los múltiples parámetros trabajados hace 4 años, pero tal vez no fue así. Lo actualicé para simplemente registrar la traza inversa, que parece ser el aspecto más relevante de la pregunta; Confío en que el lector pueda descubrir que son posibles varias llamadas de registrador, lo mismo para la concatenación de cadenas (o más Ruby-y, interpolación). –

6

logger.error caller.join("\n") deberían hacer el truco.

16

La forma en que lo hace es raíles

137    logger.fatal(
138    "\n\n#{exception.class} (#{exception.message}):\n " + 
139    clean_backtrace(exception).join("\n ") + 
140    "\n\n" 
141   ) 

248  def clean_backtrace(exception) 
249   if backtrace = exception.backtrace 
250   if defined?(RAILS_ROOT) 
251    backtrace.map { |line| line.sub RAILS_ROOT, '' } 
252   else 
253    backtrace 
254   end 
255   end 
256  end 
4

En Rails, ActionController::Rescue se ocupa de él. En mis acciones del controlador de aplicación, estoy usando el método log_error de este módulo al formato bastante traza en los registros:

def foo_action 
    # break something in here 
rescue 
    log_error($!) 
    # call firemen 
end 
+5

log_error ya no funciona en Rails 3 – Priit

9

En versiones posteriores de los carriles, simplemente elimine la línea siguiente en RAIL_ROOT/config/inicializadores/backtrace_silencers.rb (o añadir este archivo a sí mismo si no está ahí):

# Rails.backtrace_cleaner.remove_silencers! 

esta manera se obtiene la plena backtrace escrito en el registro en una excepción. Esto funciona para mí en v2.3.4.

+0

Parece que no funciona en 2.3.9 –

+1

Es parte de la documentación de Rails 3.2.3. Vea aquí: http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html – Rob

Cuestiones relacionadas