Я работаю над проектом rails, и я пытаюсь получить исключения для регистрации в файлах журналов rails. Я знаю, что могу вызвать logger.error $!
, чтобы получить первую строку исключения, зарегистрированного в файле. Но я хочу, чтобы весь стек стека регистрировался. Как я могу регистрировать всю трассировку исключения из-за использования рекордера по умолчанию?
Как я могу регистрировать всю трассировку исключения Ruby с помощью регистратора Rails по умолчанию?
Ответ 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
Вот как бы я это сделал:
Здесь ri-документация для Exception # backtrace:
Обратите внимание, что вы также можете использовать Kernel # caller, который также дает вам полную трассу (минус кратковременный кадр).
Также - обратите внимание, что если вы пытаетесь поймать все исключения, вам следует избавиться от Exception, а не RuntimeError.