37 votes

Comment enregistrer toute la trace d'une exception Ruby à l'aide du consignateur Rails par défaut?

Je travaille sur un projet de rails et j'essaie d'obtenir que les exceptions soient consignées dans les fichiers journaux de rails. Je sais que je peux appeler logger.error $! pour obtenir la première ligne de l'exception consignée dans le fichier. Cependant, je souhaite également enregistrer la pile de trace complète. Comment enregistrer toute la trace d'une exception à l'aide de l'enregistreur de rails par défaut?

39voto

Ian Terrell Points 6551
 logger.error $!.backtrace
 

En outre, n'oubliez pas que vous pouvez

 rescue ErrorType => error_name
 

pour donner à votre erreur un nom de variable autre que celui par défaut $! .

18voto

Matt Burke Points 1993

La façon dont les rails le fait est

 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
 

10voto

mxgrn Points 1168

Dans les versions ultérieures de Rails, supprimez simplement le commentaire de la ligne suivante dans RAIL_ROOT / config / initializers / backtrace_silencers.rb (ou ajoutez ce fichier lui-même s'il n'est pas présent):

 # Rails.backtrace_cleaner.remove_silencers!
 

De cette façon, la trace complète est écrite dans le journal avec une exception. Cela fonctionne pour moi dans la v2.3.4.

6voto

Redbeard Points 708

logger.error caller.join("\n") devrait faire l'affaire.

4voto

Priit Points 2196

Dans Rails, ActionController::Rescue gère. Dans mes actions de contrôleur d’application, j’utilise la méthode log_error de ce module pour effectuer une traçabilité au format intéressant dans les journaux:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X