2012-09-27 31 views
6

Có cách nào để tìm dòng mã nào đã tạo ra câu lệnh MySQL trong nhật ký phát triển Rails không?Sao lưu từ truy vấn SQL sang mã ứng dụng?

Để thực hiện một số tối ưu hóa hiệu suất, tôi muốn tìm phần nào trong ứng dụng của tôi đang tạo truy vấn MySQL nào. Khi tôi nhìn vào nhật ký của mình, tôi thấy rất nhiều truy vấn nhấp nháy xung quanh trên mỗi yêu cầu web tôi thực hiện và tôi cần phải tìm hiểu xem chúng đến từ đâu.

Tôi đang suy nghĩ về việc thêm một số biến số như ____FILE________LINE____ vào đầu ra nhật ký.

Điều đó có khả thi không?

Trả lời

4

https://github.com/lightyear/sql-logging cung cấp cho bạn backtrace cho mỗi truy vấn SQL cộng với một loạt thống kê hữu ích.

+0

bạn có biết nơi nhận plugin cho đường ray 2.x, repo svn có tên trên trang web của họ có vẻ không hoạt động. –

+0

chúng tôi sử dụng query_trace cho Rails 2. https://github.com/ntalbott/query_trace –

+0

đã làm điều đó !!!! cảm ơn! –

1

Bạn có một vài tùy chọn. Không có tùy chọn nào trong số này sẽ cung cấp cho bạn backtrace giống như cách bạn nhận được backtraces của Ruby về lỗi, nhưng chúng sẽ cung cấp cho bạn các công cụ và thông tin bạn cần để theo dõi chính xác các truy vấn SQL của bạn đến từ đâu.

  1. Rails điển hình của bạn đăng nhập sẽ giống như thế này:

    Started GET "/login" for 127.0.0.1 at Thu Sep 27 18:59:08 -0500 2012 
        Processing by PublicController#index as HTML 
        (40.9ms) SELECT COUNT(*) FROM "studies" 
        (49.6ms) SELECT COUNT(DISTINCT "activities"."whodiddit") FROM "activities" 
        (35.3ms) SELECT COUNT(*) FROM "involvements" 
    

    Tôi đoán đây là nơi mà hàng trăm bạn truy vấn SQL đang xảy ra?

    Rendered partials/_faq.haml (6.1ms) 
    Rendered public/index.html.haml within layouts/public (114.3ms) 
    Completed 200 OK in 595ms (Views: 276.7ms | ActiveRecord: 151.6ms) 
    

    Vì vậy, ở phía trên bạn đã có HTTP động từ GET và các tuyến đường (/login trong ví dụ của tôi), và các máy chủ mà từ đó nó đến. Sau đó Rails cho bạn biết controller nào được kích hoạt.

    Lưu ý: Nếu bạn thấy dòng bắt đầu bằng Rendered... thì chế độ xem của bạn sẽ được hiển thị. Mọi truy vấn SQL xuất hiện sau khi kết xuất cho biết rằng các truy vấn SQL đang được kích hoạt trong chế độ xem của bạn (ví dụ: bên ngoài bộ điều khiển của bạn). Chỉ là một điều nhỏ để suy nghĩ. Tùy thuộc vào mã mà chế độ xem của bạn đang gọi, các dòng thực sự kích hoạt các truy vấn SQL của bạn có thể được chôn trong các trình trợ giúp, các mô hình hoặc bất kỳ nơi nào khác mà mã xem gọi ra.

    Processing by PublicController#index as HTML 
    

    as HTML bit ở cuối cho bạn biết định dạng yêu cầu đến và do đó có thể sử dụng định dạng/định dạng trong phản hồi. Vì vậy, điều này cho bạn biết, về cơ bản, là các truy vấn SQL đã được kích hoạt hoặc là một phần của hành động index trong PublicController hoặc một trong các khung nhìn mà trình điều khiển đó hiển thị do hành động này được kích hoạt.

  2. Nếu có quá nhiều thứ để phân tích cú pháp, bạn sử dụng các lệnh debugger để dừng đầu ra tại các điểm khác nhau và cho phép bạn kiểm tra những gì đang diễn ra. Thông tin thêm về số debugger here.

  3. Bạn có thể sử dụng Rails.logger.info "My info message" hoặc Rails.logger.error "My error message" (tùy thuộc vào việc bạn muốn nó trong nhật ký mặc định hoặc lỗi, v.v.) để xuất trực tiếp mọi thứ trong nhật ký ứng dụng của bạn.

+0

"các dòng thực tế kích hoạt truy vấn SQL của bạn có thể được chôn trong người trợ giúp, mô hình hoặc bất kỳ nơi nào khác mà mã xem gọi ra." gì im cố gắng tìm ra là, từ đó mô hình oder helper vv .. chính xác ... Có thể thấy rằng ra? từ những gì mô-đun hoặc lớp là một phần của bản ghi được tạo ra? (40.9ms) CHỌN COUNT (*) TỪ "nghiên cứu" (49.6ms) CHỌN COUNT (DISTINCT "hoạt động". "Whodiddit") TỪ "hoạt động" (35.3ms) CHỌN COUNT (*) TỪ "sự tham gia" –

+0

Có thể Bắt đầu từ nơi mà các truy vấn SQL đến từ không quá khó chỉ nhìn vào mã, nhưng tôi cần bạn đăng một số mã thực, hoặc ít nhất là nhật ký liên quan. Tất cả những gì tôi có thể làm với câu hỏi hiện tại của bạn là cung cấp cho bạn lời khuyên chung bởi vì câu hỏi của bạn là prett y chung trong tự nhiên. – jefflunt

+0

Từ nhật ký tôi đăng, tôi có thể nói với bạn rằng SQL đang xảy ra trong bộ điều khiển (hoặc một trong các phương thức mà nó gọi), chứ không phải khung nhìn, đơn giản vì SQL được ghi lại trước dòng log nơi khung nhìn được hiển thị. Hiểu được điều đó chủ yếu là về sự hiểu biết dòng chảy của một cuộc gọi Rails. Một yêu cầu đến nó, nó được định tuyến đến một hành động điều khiển, mã hành động được chạy, các khung nhìn được hiển thị (có nghĩa là khung nhìn và mã nhúng trong khung nhìn được thực thi), và đó là khá nhiều. Nhật ký theo thứ tự thời gian của những gì được thực thi khi. – jefflunt

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