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?
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.
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
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.
logger.error caller.join("\n")
devrait faire l'affaire.
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
Voici comment je le ferais:
Voici la documentation de ri pour Exception # backtrace:
Notez que vous pouvez également utiliser Kernel # caller, qui vous donne également la trace complète (moins la trame actuelle).
De plus, notez que si vous essayez de capturer all exceptions, vous devez sauver d'Exception, pas de RuntimeError.
Vous pouvez également utiliser les variables par défaut de Ruby, comme ceci:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"