ruby on rails - print - ¿Cómo registro el seguimiento completo de una excepción de Ruby usando el registrador Rails predeterminado?
ruby logger (7)
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 a 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?
Así es como lo haría:
Aquí está la documentación ri para Exception # backtrace:
Tenga en cuenta que también puede usar Kernel # caller, que también le proporciona la traza completa (menos el marco curado).
Además, tenga en cuenta que si está tratando de detectar todas las excepciones, debe rescatar de Exception, no RuntimeError.
En Rails, ActionController::Rescue
ocupa de él. En las acciones de mi controlador de aplicaciones, estoy usando el método log_error
desde este módulo para realizar log_error
de formato bonito en los registros:
def foo_action
# break something in here
rescue
log_error($!)
# call firemen
end
En versiones posteriores de Rails, simplemente descomente la siguiente línea en RAIL_ROOT / config / initializers / backtrace_silencers.rb (o agregue este archivo si no está allí):
# Rails.backtrace_cleaner.remove_silencers!
De esta forma, obtiene la traza trasera completa escrita en el registro en una excepción. Esto funciona para mí en v2.3.4.
La forma en que los rieles lo hacen es
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
También puede usar las variables predeterminadas de Ruby, como esta:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
logger.error caller.join("/n")
debería hacer el truco.
logger.error $!.backtrace
Además, no olvides que puedes
rescue ErrorType => error_name
para darle a su error un nombre de variable que no sea el $!
predeterminado $!
.