Vô hiệu hóa đăng nhập Rails SQL trong bảng điều khiển


262

Có cách nào để vô hiệu hóa ghi nhật ký truy vấn SQL khi tôi thực hiện các lệnh trong bảng điều khiển không? Lý tưởng nhất, sẽ thật tuyệt nếu tôi có thể vô hiệu hóa nó và kích hoạt lại nó bằng một lệnh trong bảng điều khiển.

Tôi đang cố gắng gỡ lỗi một cái gì đó và sử dụng "đặt" để in ra một số dữ liệu liên quan. Tuy nhiên, đầu ra truy vấn sql làm cho nó khó đọc.


Chỉnh sửa: Tôi đã tìm thấy một giải pháp khác, vì việc thiết lập bộ ghi là không đôi khi phát sinh lỗi, nếu có gì đó không phải là mã của tôi đã cố gắng gọi logger.warn

Thay vì đặt logger thành nilbạn có thể đặt mức của logger thành 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO

since setting the logger to nil sometimes raised an erroryap .. Tôi đã nhận được cái này khi thử chạy rake db:migrate stackoverflow.com/questions/1719212/ trên
abbood

3
Xác nhận rằng điều này hoạt động trong Rails 4.1.0 trong một trình khởi tạo.
Amal Chaudhuri

Câu trả lời:


314

Để tắt nó:

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil

Để bật lại:

ActiveRecord::Base.logger = old_logger

1
Có nơi nào tôi có thể đặt cái này để tôi vô hiệu hóa đầu ra SQL vĩnh viễn không? Tôi đã thử thêm nó vào envs / dev.rb nhưng không may mắn.
samvermette

5
bạn có thể đặt mã này .irbrc, về cơ bản là .bashrcdành cho bảng điều khiển Rails. trong thực tế, bạn có thể làm bất cứ điều gì .irbrcnếu muốn, ví dụ: tô màu cú pháp, lịch sử, chỉnh sửa mã trong vi và sau đó thực thi nó trong bảng điều khiển Rails, v.v. hãy kiểm tra đá quý của tôi utility_beltnếu bạn đang sử dụng cổng Ruby 1.8 hoặc Ruby 1.9 được gọiflyrb
Giles Bowkett

2
@giles Bowkett: Trên thực tế, .irbrcgiống như .bashrcnhưng thực sự cho dòng lệnh tương tác ruby của bạn . Nó không phải là một thứ đường ray. Tôi tưởng tượng bạn có thể gặp lỗi nếu bạn cố tham chiếu các lớp rails khi bạn đang chạy irb bên ngoài môi trường rails.
eremzeit

9
@samvermette bạn có thể nó trong một tập tin cấu hình. Ví dụ:config/initializers/activerecord_logger.rb
Uri

15
ActiveRecord::Base.logger.level = 1là một câu trả lời tốt hơn nhiều vì nó sẽ không đưa ra ngoại lệ nếu bạn sử dụng .info và những người khác.
Bẩn Henry

72

Đây là một biến thể tôi cho là sạch hơn, vẫn cho phép đăng nhập tiềm năng khác từ AR. Trong cấu hình / môi trường / phát triển.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end

Lạ, không phải với tôi, trong Rails 3.0 hoặc 3.1. Tại sao Rails.logger của bạn sẽ không ở trong khối after_initialize, bạn đã làm gì khác để tùy chỉnh ngăn xếp Rails init của mình hay bạn quên cấu hình.after_initialize?
jrochkind

1
Hoạt động tuyệt vời trong ứng dụng Rails 3.1 của tôi. Seemsl ike là giải pháp tốt nhất. +1
Martijn

Không hoạt động đối với tôi ... đặt mức OK trong khối after_initialize, nhưng mức trở về 0 khi thời gian bảng điều khiển mở. Lạ thật. (Tôi đang sử dụng Pry như một sự thay thế giao diện điều khiển, có phải vậy không?)
Mike Blyth

63

Đây có thể không phải là một giải pháp phù hợp cho giao diện điều khiển, nhưng Rails có một phương pháp cho vấn đề này: Logger # im lặng

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end

4
Sẽ chỉ hoạt động cho tối đa Rails 3: "CẢNH BÁO KHAI THÁC: sự im lặng không được chấp nhận và sẽ bị xóa khỏi Rails 4.0"
Kangur

6
@Kangur Tôi đang trên đường ray 4.2 và sự im lặng dường như hoạt động tốt
Benjamin Crouzier

2
@Kangur Tôi cũng có thể xác nhận phương pháp này hoạt động tốt trên Rails 4.2
Greg Matthew Crossley

6
Hoạt động trong Rails 5 và tôi thấy không có cảnh báo. Đây là câu trả lời tốt nhất IMO.
Quá

1
Hoạt động tốt trong Rails 6. Có lẽ nó chỉ được di chuyển xung quanh một chút?
johncip

16

Đối với Rails 4, bạn có thể đặt các mục sau vào tệp môi trường:

# /config/environments/development.rb

config.active_record.logger = nil

Điều đó sẽ chỉ có hiệu lực trong sản xuất, trong đó việc đăng nhập hầu hết bị thay thế ....
Rob

13

Trong trường hợp ai đó thực sự muốn loại bỏ việc ghi nhật ký SQL (mà không thay đổi mức ghi nhật ký và trong khi vẫn giữ nhật ký từ các mô hình AR của họ):

Dòng ghi vào nhật ký (trong Rails 3.2.16, dù sao) là cuộc gọi đến debugtrong lib/active_record/log_subscriber.rb:50.

Phương pháp gỡ lỗi được định nghĩa bởi ActiveSupport::LogSubscriber.

Vì vậy, chúng ta có thể loại bỏ việc đăng nhập bằng cách ghi đè lên như vậy:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end

Tốt một. Điều này hoạt động trên đăng nhập SQL mà không ảnh hưởng đến Rails.logger.debugbáo cáo.
Teemu Leisti 3/03/2015

Tổng số noob ở đây. Chính xác thì chúng ta nên đặt cái này ở đâu?
devius

Tôi giữ nó trong lib / khỉpatch.rb và có đường ray kéo nó vào với dòng sau trong config / application.rb : Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Hãy nhớ rằng khỉpatching được một số người nhăn mặt. Có lẽ không nên kiểm tra điều này vào mã sản xuất của bạn.
fakeleft

8

Tôi đã sử dụng cái này: config.log_level = :info chỉnh sửaconfig/environments/performance.rb

Làm việc tuyệt vời cho tôi, từ chối đầu ra SQL và chỉ hiển thị kết xuất và thông tin quan trọng.


Tôi đang trên đường ray 4.1.0 và nó hoạt động tốt với tôi. cảm ơn
Zakaria

4

Trong Rails 3.2 Tôi đang làm một cái gì đó như thế này trong config / môi trường / Development.rb:

module MyApp
  class Application < Rails::Application
    console do
      ActiveRecord::Base.logger = Logger.new( Rails.root.join("log", "development.log") )
    end
  end
end

2

Giống như một FYI, trong Rails 2 bạn có thể làm

ActiveRecord::Base.silence { <code you don't want to log goes here> }

Rõ ràng các dấu ngoặc nhọn có thể được thay thế bằng một do endkhối nếu bạn muốn.

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.