Rails: registrazione dell'intera traccia dello stack di un'eccezione


110

Ho cercato di capire il modo giusto per registrare un'analisi dello stack. Mi sono imbattuto in questo collegamento che afferma che logger.error $ !, $ !. backtrace è la strada da percorrere ma che non funziona per me log_error fa. Come da documentazione, non vedo come il passaggio di un secondo argomento al metodo di errore funzionerebbe comunque perché il registratore di ruby ​​utilizzato da rails accetta solo un singolo argomento.

Stranamente (o forse no) il secondo argomento è accettato senza alcuna lamentela da parte dell'interprete. Tuttavia tutto ciò che gli passo viene ignorato.

Qualcuno può spiegare cosa mi manca? Qualche idea su cosa sia il secondo argomento dell'errore e cosa lo sta mangiando?

Risposte:


204

Se guardi l'origine della classe BufferedLogger in ActiveSupport, vedrai che il secondo argomento è "progname". Viene utilizzato solo quando il primo argomento è nullo e non gli è stato assegnato alcun blocco oppure il blocco restituisce un valore non vero.

In sostanza, non puoi usare il secondo parametro per produrre materiale aggiuntivo.

Quello che vuoi fare è qualcosa di più simile a:

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

A seconda di come hai impostato la tua registrazione, potrebbe essere meglio iterare su ogni riga del backtrace e stamparla separatamente poiché alcuni logger non generano nuove righe, nel qual caso dovresti fare qualcosa come:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

5
Mi unirei utilizzando "\ r \ n" per mantenere la compatibilità multipiattaforma.
James Watkins

10
Non useresti $/invece, per essere compatibile multipiattaforma? Lascia che Ruby se ne occupi, poiché \r\nè specifico solo per alcune piattaforme.
vgoff

12
Il messaggio potrebbe essere diviso e illeggibile perché chiamare logger più volte non è thread-safe. Mentre il logger stesso è thread-safe. Di solito unisco il mio messaggio in una stringa e poi lo registro.
Morozov

Al momento il logger non sembrava supportare le nuove righe nelle voci di registro, da qui la divisione, ma sì, hai ragione e dovresti essere consapevole dei limiti di questo approccio
darkliquid

+1 @JackWatson risposta assolutamente strana perché non è thread-safe. È una cosa importante perché stiamo parlando di app web qui
EvAlex

16

Questa è la risposta.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
meno punteggiatura:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.