Rails: ведение журнала всей трассировки стека исключения

110

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

Как ни странно (а может, и нет) второй аргумент принимается без претензий переводчика. Однако все, что я перехожу к нему, игнорируется.

Может ли кто-нибудь объяснить, что мне не хватает? Есть ли понимание того, для чего нужен второй аргумент ошибки и что его съедает?

Мойз Раджа
источник

Ответы:

204

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

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

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

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
темная жидкость
источник
5
Я бы присоединился к использованию "\ r \ n" для поддержания кроссплатформенной совместимости.
Джеймс Уоткинс,
10
Разве вы не использовали бы $/вместо этого для кросс-платформенной совместимости? Пусть об этом позаботится Ruby, поскольку \r\nэто характерно только для некоторых платформ.
vgoff 06
12
Вы можете разделить свое сообщение и сделать его нечитаемым, потому что многократный вызов регистратора не является потокобезопасным. Хотя сам регистратор поточно-ориентирован. Обычно я объединяю свое сообщение в одну строку, а затем регистрирую его.
Морозов
В то время регистратор, похоже, не поддерживал новые строки в записях журнала, отсюда и разделение, но да, вы совершенно правы, и вам следует знать об ограничениях этого подхода
darkliquid
+1 @JackWatson совершенно странный ответ, потому что он не потокобезопасен. Это важно, потому что здесь мы говорим о веб-приложениях
EvAlex
16

Это ответ.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end
Кубун
источник
9
меньше знаков препинания:Rails.logger.error [e.message, *e.backtrace].join($/)
artm