Я работаю над проектом rails и пытаюсь получить исключения, которые будут записываться в файлы журнала rails. Я знаю, что могу позвонить logger.error $!, чтобы записать в файл первую строку исключения. Но я хочу также зарегистрировать весь стек трассировки. Как мне записать всю трассировку обратно исключения, используя регистратор rails по умолчанию?
logger.error $!
logger.error $!.backtrace
Кроме того, не забудьте, что вы можете
rescue ErrorType => error_name
, чтобы дать вашей ошибке имя переменной, отличное от значения по умолчанию $!.
$!
То, как рельсы это делают,
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
В более поздних версиях Rails просто раскомментируйте следующую строку в RAIL_ROOT / config / initializers / backtrace_silencers.rb (или добавьте этот файл сам, если его там нет):
# Rails.backtrace_cleaner.remove_silencers!
Таким образом, вы получаете полную обратную запись, записанную в журнал для исключения. Это работает для меня в v2.3.4.
logger.error caller.join("\n") должен сделать трюк.
logger.error caller.join("\n")
В Rails ActionController::Rescue имеет дело с этим. В моих действиях контроллера приложений я использую метод log_error из этого модуля для довольно -форматного возврата в журналах:
ActionController::Rescue
log_error
def foo_action # break something in here rescue log_error($!) # call firemen end
Вот как бы я это сделал:
http://gist.github.com/127708
Вот документация ri для Exception # backtrace:
http://gist.github.com/127710
Обратите внимание, что вы также можете использовать Kernel # caller, который также дает вам полную трассировку (за исключением кадра фрейма).
http://gist.github.com/127709
Также: обратите внимание, что если вы пытаетесь перехватить все исключений, вам следует спасаться из Exception, а не RuntimeError.
Вы также можете использовать переменные по умолчанию в ruby, например:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"