web-dev-qa-db-fra.com

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

Je travaille sur le projet 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 du consignateur Rails par défaut?

35
Josh Moore
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 le $! par défaut.

38
Ian Terrell

La façon dont Rails le fait

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
16
Matt Burke

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.

9
mxgrn

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

6
Redbeard

Dans Rails, ActionController::Rescue s'en occupe. 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 assez précis dans les journaux:

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

Voici comment je le ferais:

http://Gist.github.com/127708

Voici la documentation de ri pour Exception # backtrace:

http://Gist.github.com/127710

Notez que vous pouvez également utiliser Kernel # caller, qui vous donne également la trace complète (moins la trame actuelle).

http://Gist.github.com/127709

De plus, notez que si vous essayez de capturer all exceptions, vous devez sauver d'Exception, pas de RuntimeError.

3
user52804

Vous pouvez également utiliser les variables par défaut de Ruby, comme ceci:

logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
0
user3223833