Rails: запись всей трассировки стека исключения

Я пытаюсь выяснить правильный способ регистрации трассировки стека. Я наткнулся на эту ссылку, в которой говорится, что logger.error $!, $!. backtrace - это путь, но это не работает me log_error. В соответствии с документацией я не вижу, как прохождение второго аргумента в метод ошибки будет работать так или иначе, потому что рубиновый регистратор, который использует рельсы, принимает только один аргумент.

Странно (или, может быть, нет) второй аргумент принимается без каких-либо претензий с помощью переводчика. Однако все, что я передаю ему, игнорируется.

Кто-нибудь может объяснить, чего я не вижу? Любое понимание того, к чему относится второй аргумент ошибки и что его едят?

Ответ 1

Если вы посмотрите на источник класса BufferedLogger в ActiveSupport, вы увидите, что вторым аргументом является "progname". Это используется только тогда, когда первый аргумент равен nil, и вы либо не дали ему никакого блока, либо блок возвращали неверное значение.

По сути, вы не можете использовать второй параметр для вывода дополнительных материалов.

Что вы хотите сделать, это нечто более похожее на:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

В зависимости от того, как у вас установлена ​​настройка ведения журнала, может быть лучше выполнить итерацию по каждой строке обратной линии и распечатать ее отдельно, поскольку определенные журналы не выводят символы новой строки, и в этом случае вы сделаете что-то вроде:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end