2008-10-23 12 views
34

Ich arbeite auf Schienen Projekt und ich versuche, Ausnahmen zu erhalten, um in den Schienen Protokolldateien protokolliert werden. Ich weiß, dass ich logger.error $! aufrufen kann, um die erste Zeile der in der Datei protokollierten Ausnahme zu erhalten. Aber ich möchte auch den gesamten Trace-Stack protokollieren lassen. Wie protokolliere ich die gesamte Rückverfolgung einer Ausnahme mit dem Standard-Rails-Logger?Wie protokolliere ich die gesamte Rückverfolgung einer Ruby-Ausnahme mit dem Standard-Rails-Logger?

Antwort

38
logger.error $!.backtrace 

Auch vergessen Sie nicht, dass Sie

rescue ErrorType => error_name 

$! Ihre Fehler einen Variablennamen andere als die Standard zu geben.

+1

Fehle ich etwas? logger.error nimmt nur ein einziges Argument, so dass der Code nicht funktioniert ... –

+19

Dieser funktioniert nicht, benutze 'logger.error e.message + "\ n" + e.backtrace.join ("\ n") 'stattdessen. –

+3

Ich könnte schwören, die verschiedenen Parameter vor 4 Jahren gearbeitet, aber vielleicht hat es nicht. Ich habe es aktualisiert, um nur das Backtrace zu protokollieren, was der relevanteste Aspekt der Frage zu sein scheint. Ich vertraue darauf, dass der Leser herausfinden kann, dass mehrere Logger-Aufrufe möglich sind, dito für die String-Verkettung (oder mehr Ruby-y, Interpolation). –

6

logger.error caller.join("\n") sollte den Trick tun.

16

Die Art und Weise Schienen tut es

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 
4

In Rails, ActionController::Rescue behandelt ist. In meiner Anwendung Controller-Aktionen, verwende ich Methode log_error von diesem Modul zu recht-Format Backtrace in Protokollen:

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

log_error funktioniert nicht mehr in Rails 3 – Priit

9

In späteren Versionen von Rails, Kommentar- einfach die folgende Zeile in RAIL_ROOT/config/initializers/backtrace_silencers.rb (oder fügen Sie diese Datei selbst wenn er nicht da ist):

# Rails.backtrace_cleaner.remove_silencers! 

diese Weise können Sie die volle bekommen Backtrace in das Protokoll einer Ausnahme geschrieben. Dies funktioniert für mich in v2.3.4.

+0

Scheint nicht in 2.3.9 zu funktionieren –

+1

Es ist Teil der Dokumentation für Rails 3.2.3. Siehe hier: http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html – Rob

Verwandte Themen