Rails: rejestrowanie całego śladu stosu wyjątku


110

Próbowałem znaleźć właściwy sposób rejestrowania śladu stosu. Natknąłem się na ten link, który stwierdza, że logger.error $!, $ !. backtrace jest drogą do zrobienia, ale to nie działa dla mnie log_error . Zgodnie z dokumentacją nie widzę, jak przekazanie drugiego argumentu do metody błędu i tak działałoby, ponieważ rejestrator ruby, którego używa rails, akceptuje tylko jeden argument.

O dziwo (a może nie) drugi argument jest przyjmowany bez żadnych skarg tłumacza. Jednak wszystko, co do niego przekazuję, jest ignorowane.

Czy ktoś może wyjaśnić, czego mi brakuje? Jakiś wgląd w to, po co jest drugi argument za błędem i co go zjada?

Odpowiedzi:


204

Jeśli spojrzysz na źródło klasy BufferedLogger w ActiveSupport, zobaczysz, że drugi argument to „progname”. Jest używane tylko wtedy, gdy pierwszy argument ma wartość nil i albo nie nadałeś mu żadnego bloku, albo blok zwrócił wartość nieprawdę.

Zasadniczo nie możesz użyć drugiego parametru do wyprowadzenia dodatkowych rzeczy.

To, co chcesz zrobić, jest bardziej zbliżone do:

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

W zależności od tego, jak masz konfigurację rejestrowania, może być lepiej powtórzyć każdy wiersz śledzenia wstecznego i wydrukować go osobno, ponieważ niektóre rejestratory nie wyświetlają znaków nowych linii, w takim przypadku możesz zrobić coś takiego:

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

5
Przyłączyłbym się używając "\ r \ n", aby zachować kompatybilność między platformami.
James Watkins

10
Czy nie użyłbyś $/zamiast tego, aby być kompatybilnym z różnymi platformami? Pozwól Ruby się tym zająć, ponieważ \r\njest to specyficzne tylko dla kilku platform.
vgoff

12
Wiadomość może zostać podzielona i nieczytelna, ponieważ wielokrotne wywoływanie programu rejestrującego nie jest bezpieczne dla wątków. Chociaż sam rejestrator jest bezpieczny dla wątków. Zwykle dołączam wiadomość do jednego ciągu, a następnie ją rejestruję.
Morozov

W tamtym czasie rejestrator wydawał się nie obsługiwać nowych linii we wpisach dziennika, stąd podział, ale tak, masz całkowitą rację i powinieneś być świadomy ograniczeń tego podejścia
darkliquid

+1 @JackWatson absolutnie dziwna odpowiedź, ponieważ nie jest bezpieczna dla wątków. To ważna rzecz, ponieważ mówimy tutaj o aplikacjach internetowych
EvAlex,

16

To jest odpowiedź.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
mniej interpunkcji: Rails.logger.error [e.message, *e.backtrace].join($/)
artm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.