2013-05-14 38 views
7

Đường ray đi kèm với lớp logger của Ruby trong thư viện chuẩn. Các cấp nhật ký có sẵn là: :debug, :info, :warn, :error:fatal. Tôi đã tự hỏi nếu tôi thêm đăng nhập rộng rãi trong ứng dụng Rails với mức nhật ký được đặt thành :debug để phát triển và thử nghiệm, sẽ có tác động hiệu suất khi chạy trong sản xuất với tính năng ghi nhật ký bị tắt hoặc được đặt ở cấp cao hơn, chẳng hạn như config.log_level = :fatal?Đang đăng nhập vào Rails, có hiệu suất nào không?

Trả lời

17

Câu trả lời ngắn gọn là việc ghi nhật ký sẽ luôn có tác động hiệu suất, đặc biệt khi đăng nhập vào đĩa. Tuy nhiên, có một vài sự tinh tế.

Thứ nhất, sử dụng mức :debug sẽ có tỷ lệ hiệu suất lớn hơn :fatal, vì số chuỗi lớn hơn đang được đánh giá và ghi vào đầu ra nhật ký (ví dụ: đĩa).

Một cạm bẫy tiềm năng là nếu bạn có nhiều cuộc gọi như thế này trong mã của bạn:

logger.debug = "my string to debug with a #{variable}" 

Sẽ có một tác động hiệu quả ngay cả khi mức sản lượng cho phép không bao gồm gỡ lỗi. Lý do là Ruby phải đánh giá các chuỗi này, bao gồm việc khởi tạo đối tượng hơi nặng String và nội suy các biến và cần có thời gian.

Do đó, chúng tôi khuyên bạn nên chuyển khối sang phương thức nhật ký, vì chúng chỉ được đánh giá nếu mức đầu ra giống nhau hoặc được bao gồm trong mức cho phép (tức là tải chậm). Cùng một mã được viết lại sẽ là:

logger.debug { "my string to debug with a #{variable}" } 

Nội dung của khối và do đó nội suy chuỗi chỉ được đánh giá nếu gỡ lỗi được bật. Điều này tiết kiệm hiệu suất chỉ thực sự đáng chú ý với số lượng lớn đăng nhập, nhưng đó là một thực hành tốt để sử dụng.

Bạn có thể đọc thêm về điều này trong số Logger docs.

+1

Không biết bạn có thể chuyển khối để ghi nhật ký. Hoàn hảo! – CuriousMind

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