Rails: registro de todo el seguimiento de la pila de una excepción

110

He estado tratando de encontrar la forma correcta de registrar un seguimiento de pila. Encontré este enlace que indica que logger.error $ !, $ !. backtrace es el camino a seguir, pero eso no me funciona log_error . Según la documentación, no veo cómo funcionaría pasar un segundo argumento al método de error de todos modos porque el registrador ruby ​​que usa Rails solo acepta un solo argumento.

Curiosamente (o tal vez no) el segundo argumento se acepta sin quejas del intérprete. Sin embargo, todo lo que le paso se ignora.

¿Alguien puede explicar lo que me estoy perdiendo? ¿Alguna idea de para qué sirve el segundo argumento del error y qué lo está comiendo?

Moiz Raja
fuente

Respuestas:

204

Si observa la fuente de la clase BufferedLogger en ActiveSupport, verá que el segundo argumento es 'progname'. Esto se usa solo cuando el primer argumento es nulo y no le ha dado ningún bloque o el bloque devuelve un valor no verdadero.

En esencia, no puede usar el segundo parámetro para generar material adicional.

Lo que quieres hacer es algo más parecido a:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

Dependiendo de cómo tenga su configuración de registro, podría ser mejor iterar a través de cada línea del backtrace e imprimirlo por separado, ya que ciertos registradores no generan nuevas líneas, en cuyo caso haría algo como:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end
líquido oscuro
fuente
5
Me uniría usando "\ r \ n" para mantener la compatibilidad multiplataforma.
James Watkins
10
¿No lo usaría $/en su lugar, para ser compatible con varias plataformas? Deje que Ruby se encargue de ello, ya \r\nque solo es específico para algunas plataformas.
vgoff
12
Es posible que su mensaje se divida y sea ilegible porque llamar al registrador varias veces no es seguro para subprocesos. Mientras que el registrador en sí es seguro para subprocesos. Por lo general, me uno a mi mensaje en una cadena y luego lo registro.
Morozov
En ese momento, el registrador no parecía admitir nuevas líneas en las entradas del registro, de ahí la división, pero sí, tiene razón y debe ser consciente de las limitaciones de este enfoque
darkliquid
+1 @JackWatson respuesta absolutamente extraña porque no es seguro para subprocesos. Es algo importante porque estamos hablando de aplicaciones web aquí
EvAlex
16

Esta es la respuesta.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end
kuboon
fuente
9
menos puntuación:Rails.logger.error [e.message, *e.backtrace].join($/)
artm