2008-10-23 16 views
34

Tôi đang làm việc trên dự án đường ray và tôi đang cố gắng để có ngoại lệ được ghi vào tệp nhật ký đường ray. Tôi biết tôi có thể gọi logger.error $! để nhận được dòng đầu tiên của ngoại lệ được ghi vào tệp. Nhưng, tôi muốn có được toàn bộ dấu vết ngăn xếp được đăng nhập là tốt. Làm cách nào để đăng nhập toàn bộ dấu vết của một ngoại lệ bằng trình ghi nhật ký đường ray mặc định?Làm cách nào để ghi lại toàn bộ dấu vết của ngoại lệ Ruby bằng trình ghi nhật ký Rails mặc định?

Trả lời

38
logger.error $!.backtrace 

Ngoài ra, đừng quên bạn có thể

rescue ErrorType => error_name 

để cung cấp cho lỗi lầm của mình một tên biến khác với mặc định $!.

+1

Tôi có thiếu gì đó không? logger.error chỉ nhận một đối số duy nhất, vì vậy mã đó không hoạt động ... –

+19

Cái này không hoạt động, sử dụng 'logger.error e.message +" \ n "+ e.backtrace.join (" \ n ") 'thay thế. –

+3

Tôi có thể thề nhiều thông số đã hoạt động cách đây 4 năm, nhưng có lẽ nó không. Tôi đã cập nhật nó để chỉ đăng nhập backtrace, mà có vẻ là khía cạnh có liên quan nhất của câu hỏi; Tôi tin tưởng người đọc có thể tìm ra nhiều cuộc gọi logger là có thể, ditto cho chuỗi nối (hoặc nhiều hơn Ruby-y, nội suy). –

6

logger.error caller.join("\n") nên thực hiện thủ thuật.

16

Cách đường ray không nó là

137    logger.fatal(
138    "\n\n#{exception.class} (#{exception.message}):\n " + 
139    clean_backtrace(exception).join("\n ") + 
140    "\n\n" 
141   ) 

248  def clean_backtrace(exception) 
249   if backtrace = exception.backtrace 
250   if defined?(RAILS_ROOT) 
251    backtrace.map { |line| line.sub RAILS_ROOT, '' } 
252   else 
253    backtrace 
254   end 
255   end 
256  end 
4

Trong Rails, ActionController::Rescue giao dịch với nó. Trong ứng dụng hành động điều khiển của tôi, tôi đang sử dụng phương pháp log_error từ mô-đun này để khá định dạng vết lùi trong nhật ký:

def foo_action 
    # break something in here 
rescue 
    log_error($!) 
    # call firemen 
end 
+5

log_error không hoạt động trong Rails 3 nữa – Priit

3

Đây là cách tôi sẽ làm điều đó:

http://gist.github.com/127708

Đây là tài liệu hướng dẫn ri cho Exception # backtrace:

http://gist.github.com/127710

Lưu ý rằng bạn coul d cũng sử dụng Kernel # caller, cung cấp cho bạn dấu vết đầy đủ (trừ khung curent).

http://gist.github.com/127709

Ngoài ra - Lưu ý rằng nếu bạn đang cố gắng để bắt tất cả trường hợp ngoại lệ, bạn nên giải cứu từ ngoại lệ, không RuntimeError.

9

Trong các phiên bản sau này của Rails, chỉ cần bỏ ghi chú dòng sau trong RAIL_ROOT/config/initializers/backtrace_silencers.rb (hoặc thêm file này chính nó nếu nó không có):

# Rails.backtrace_cleaner.remove_silencers! 

Bằng cách này bạn sẽ có được đầy đủ backtrace được ghi vào nhật ký trên một ngoại lệ. Điều này làm việc cho tôi trong v2.3.4.

+0

Có vẻ như không hoạt động trong 2.3.9 –

+1

Đó là một phần của tài liệu dành cho Rails 3.2.3. Xem tại đây: http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html – Rob

Các vấn đề liên quan