Как мне записать всю трассировку обратно исключения Ruby с помощью стандартного регистратора Rails? - PullRequest
36 голосов
/ 23 октября 2008

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

Ответы [ 7 ]

38 голосов
/ 25 октября 2008
logger.error $!.backtrace

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

rescue ErrorType => error_name

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

17 голосов
/ 26 октября 2008

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

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
9 голосов
/ 06 октября 2009

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

# Rails.backtrace_cleaner.remove_silencers!

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

6 голосов
/ 23 октября 2008

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

4 голосов
/ 21 ноября 2008

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

def foo_action
  # break something in here
rescue
  log_error($!)
  # call firemen
end
3 голосов
/ 11 июня 2009

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

http://gist.github.com/127708

Вот документация ri для Exception # backtrace:

http://gist.github.com/127710

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

http://gist.github.com/127709

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

1 голос
/ 25 мая 2018

Вы также можете использовать переменные по умолчанию в ruby, например:

logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...