Rails: реєстрація всього сліду стека виключення


110

Я намагався розібратися, як правильно записати слід стека. Я натрапив на це посилання, в якому йдеться про те, що logger.error $ !, $ !. зворотний шлях - це шлях, але це не працює для мене log_error . Згідно з документацією, я не бачу, як передача другого аргументу методу помилок все-таки спрацювала, оскільки реєстратор рубіну, який використовується в рейлах, приймає лише один аргумент.

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

Хтось може пояснити, чого я пропускаю? Будь-яке розуміння того, для чого полягає другий аргумент помилки і що це їсть?

Відповіді:


204

Якщо ви подивитесь на джерело для класу BufferedLogger в ActiveSupport, ви побачите, що другий аргумент - "ім'я прогрес". Це використовується лише тоді, коли перший аргумент є нульовим, і ви або не дали йому жодного блоку, або блок не поверне неістинне значення.

По суті, ви не можете використовувати другий параметр для виведення додаткових матеріалів.

Що ви хочете зробити, це щось більш схоже на:

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
Чи не використовуєте ви $/, щоб бути сумісним між платформами? Нехай Рубі подбає про це, як \r\nце характерно лише для кількох платформ.
vgoff

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.