Как я могу регистрировать всю трассировку исключения Ruby с помощью регистратора Rails по умолчанию?

Я работаю над проектом rails, и я пытаюсь получить исключения для регистрации в файлах журналов rails. Я знаю, что могу вызвать logger.error $!, чтобы получить первую строку исключения, зарегистрированного в файле. Но я хочу, чтобы весь стек стека регистрировался. Как я могу регистрировать всю трассировку исключения из-за использования рекордера по умолчанию?

Ответ 1

logger.error $!.backtrace

Кроме того, не забывайте, что вы можете

rescue ErrorType => error_name

чтобы дать вашей ошибке имя переменной, отличное от значения по умолчанию $!.

Ответ 2

Как рельсы делают это

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

Ответ 3

В более поздних версиях Rails просто раскомментируйте следующую строку в RAIL_ROOT/config/initializers/backtrace_silencers.rb(или добавьте этот файл, если он там отсутствует):

# Rails.backtrace_cleaner.remove_silencers!

Таким образом вы получите полную обратную запись, записанную в журнал, на исключение. Это работает для меня в версии 2.3.4.

Ответ 4

logger.error caller.join("\n") должен сделать трюк.

Ответ 5

В Rails, ActionController::Rescue имеет дело с ним. В моих действиях диспетчера приложений я использую метод log_error из этого модуля в довольно-образную обратную трассировку в журналах:

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

Ответ 6

Вот как бы я это сделал:

http://gist.github.com/127708

Здесь ri-документация для Exception # backtrace:

http://gist.github.com/127710

Обратите внимание, что вы также можете использовать Kernel # caller, который также дает вам полную трассу (минус кратковременный кадр).

http://gist.github.com/127709

Также - обратите внимание, что если вы пытаетесь поймать все исключения, вам следует избавиться от Exception, а не RuntimeError.