Rails: Ghi lại toàn bộ dấu vết ngăn xếp của một ngoại lệ


110

Tôi đã cố gắng tìm ra cách phù hợp để ghi lại dấu vết ngăn xếp. Tôi đã xem qua này liên kết trong đó nêu rằng logger.error $ !, $ !. backtrace là con đường để đi nhưng điều đó không làm việc cho tôi log_error làm. Theo tài liệu, tôi không thấy cách chuyển đối số thứ hai cho phương thức lỗi sẽ hoạt động như thế nào vì trình ghi ruby ​​mà rails sử dụng chỉ chấp nhận một đối số duy nhất.

Kỳ lạ là (hoặc có thể không) lập luận thứ hai được chấp nhận mà không có bất kỳ khiếu nại nào của phiên dịch viên. Tuy nhiên bất cứ điều gì mà tôi vượt qua nó đều bị bỏ qua.

Bất cứ ai có thể giải thích những gì tôi đang thiếu? Bất kỳ thông tin chi tiết nào về đối số thứ hai đối với lỗi là gì và đang ăn nó là gì?

Câu trả lời:


204

Nếu bạn nhìn vào nguồn của lớp BufferedLogger trong ActiveSupport, bạn sẽ thấy rằng đối số thứ hai là 'progname'. Điều này chỉ được sử dụng khi đối số đầu tiên là nil và bạn đã cho nó không có khối nào hoặc khối trả về một giá trị không đúng.

Về bản chất, bạn không thể sử dụng tham số thứ hai để xuất nội dung bổ sung.

Những gì bạn muốn làm là một cái gì đó giống như:

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

Tùy thuộc vào cách bạn thiết lập nhật ký của mình, tốt hơn là bạn nên lặp lại từng dòng của backtrace và in nó riêng biệt vì các trình ghi nhật ký nhất định không xuất ra các dòng mới, trong trường hợp đó bạn sẽ làm như sau:

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

5
Tôi sẽ tham gia bằng cách sử dụng "\ r \ n" để duy trì khả năng tương thích đa nền tảng.
James Watkins

10
$/Thay vào đó, bạn sẽ không sử dụng để tương thích với nhiều nền tảng? Hãy để Ruby chăm sóc nó, vì \r\nnó chỉ dành riêng cho một số nền tảng.
vgoff

12
Bạn có thể nhận được tin nhắn bị chia nhỏ và không thể đọc được vì trình ghi nhật ký cuộc gọi nhiều lần không an toàn cho chuỗi. Trong khi bản thân trình ghi là chủ đề an toàn. Thường thì tôi nối tin nhắn của mình thành một chuỗi rồi ghi lại.
Morozov

Vào thời điểm đó, trình ghi nhật ký dường như không hỗ trợ dòng mới trong các mục nhập nhật ký, do đó việc phân tách nhưng có, bạn hoàn toàn đúng và bạn nên biết những hạn chế của phương pháp này
darkliquid

+1 @JackWatson câu trả lời hoàn toàn kỳ lạ vì nó không an toàn. Điều quan trọng là vì chúng ta đang nói về các ứng dụng web ở đây
EvAlex

16

Đây là câu trả lời.

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

9
ít dấu chấm câu:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.