Nonaktifkan Rails SQL logging di konsol

262

Apakah ada cara untuk menonaktifkan pendataan query SQL ketika saya menjalankan perintah di konsol? Idealnya, akan lebih bagus jika saya bisa menonaktifkannya dan mengaktifkannya kembali dengan perintah di konsol.

Saya mencoba men-debug sesuatu dan menggunakan "put" untuk mencetak beberapa data yang relevan. Namun, hasil kueri sql membuatnya sulit dibaca.


Sunting: Saya menemukan solusi lain, karena mengatur logger ke nil terkadang menimbulkan kesalahan, jika sesuatu selain kode saya mencoba memanggil logger.warn

Alih-alih mengatur logger untuk nilAnda dapat mengatur tingkat logger 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
gylaz
sumber
since setting the logger to nil sometimes raised an errorya .. Saya dapat yang ini ketika mencoba menjalankan rake db:migrate stackoverflow.com/questions/1719212/…
abbood
3
Mengkonfirmasi bahwa ini berfungsi di Rails 4.1.0 di penginisialisasi.
Amal Chaudhuri

Jawaban:

314

Untuk mematikannya:

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

Untuk mengaktifkannya kembali:

ActiveRecord::Base.logger = old_logger
Ryan Bigg
sumber
1
Apakah ada tempat saya bisa meletakkan ini sehingga saya menonaktifkan output SQL secara permanen? Saya mencoba menambahkannya ke envs / dev.rb tetapi tidak berhasil.
samvermette
5
Anda dapat memasukkan kode ini .irbrc, yang pada dasarnya .bashrcuntuk konsol Rails. sebenarnya Anda dapat melakukan apa saja .irbrcjika Anda ingin, misalnya pewarnaan sintaks, histori, edit kode in vi dan kemudian jalankan di konsol Rails, dll. periksa permata saya utility_beltjika Anda menggunakan Ruby 1.8 atau port Ruby 1.9 disebutflyrb
Giles Bowkett
2
@ giles bowkett: Sebenarnya, .irbrcseperti .bashrctetapi sebenarnya untuk perintah interaktif ruby Anda . Itu bukan hal rel. Saya membayangkan Anda mungkin akan mendapatkan kesalahan jika Anda mencoba referensi kelas rel ketika Anda menjalankan irb di luar lingkungan rel.
eremzeit
9
@samvermette Anda dapat melakukannya dalam file konfigurasi. Misalnya:config/initializers/activerecord_logger.rb
Uri
15
ActiveRecord::Base.logger.level = 1adalah jawaban yang jauh lebih baik karena tidak akan menimbulkan pengecualian jika Anda menggunakan .info dan lainnya.
Dirty Henry
72

Berikut variasi yang saya anggap lebih bersih, yang masih memungkinkan potensi logging lainnya dari AR. Di config / environment / development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
Jrochkind
sumber
Aneh, bukan untuk saya, di Rails 3.0 atau 3.1. Mengapa Rails.logger Anda tidak ada dalam blok after_initialize, apakah Anda melakukan sesuatu yang lain untuk menyesuaikan init Rails init Anda, atau apakah Anda lupa config.after_initialize?
jrochkind
1
Berfungsi bagus di aplikasi Rails 3.1 saya. Sepertinya solusi terbaik. +1
Martijn
Tidak berfungsi untuk saya ... setel level OK di blok after_initialize, tetapi levelnya kembali ke 0 pada saat konsol terbuka. Aneh. (Saya menggunakan Pry sebagai pengganti konsol, apakah itu sebabnya?)
Mike Blyth
63

Ini mungkin bukan solusi yang cocok untuk konsol, tetapi Rails memiliki metode untuk masalah ini: Logger # silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
Christoph Petschnig
sumber
4
Hanya akan berfungsi hingga Rails 3: "PERINGATAN PENUTUPAN: keheningan sudah usang dan akan dihapus dari Rails 4.0"
Kangur
6
@ Kangur saya di kereta 4.2 dan keheningan tampaknya bekerja dengan baik
Benjamin Crouzier
2
@ Kangur Saya juga dapat mengkonfirmasi bahwa pendekatan ini berfungsi dengan baik di Rails 4.2
Greg Matthew Crossley
6
Bekerja di Rails 5 dan saya tidak melihat peringatan. Ini jawaban terbaik IMO.
Overload119
1
Berfungsi dengan baik di Rails 6. Mungkin baru saja dipindahkan sedikit?
johncip
16

Untuk Rails 4 Anda dapat meletakkan yang berikut ini di file lingkungan:

# /config/environments/development.rb

config.active_record.logger = nil
Mikha
sumber
Itu hanya akan berpengaruh pada produksi, di mana penebangan sebagian besar tertekan pula ....
Rob
13

Jika seseorang ingin benar - benar melumpuhkan logging pernyataan SQL (tanpa mengubah level logging, dan sambil menjaga logging dari model AR mereka):

Baris yang menulis ke log (di Rails 3.2.16, toh) adalah panggilan debugmasuk lib/active_record/log_subscriber.rb:50.

Metode debug didefinisikan oleh ActiveSupport::LogSubscriber.

Jadi kita dapat menghapus log dengan menimpanya seperti:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
fakeleft
sumber
Bagus Ini berfungsi pada SQL logging tanpa mempengaruhi Rails.logger.debugpernyataan.
Teemu Leisti
Total noob di sini. Di mana tepatnya kita harus meletakkan ini?
devius
Aku menyimpannya di lib / monkeypatch.rb dan memiliki rel menariknya dengan baris berikut di config / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Perlu diingat bahwa monkeypatching disukai oleh beberapa orang. Mungkin sebaiknya jangan periksa ini ke kode produksi Anda.
fakeleft
8

Saya menggunakan ini: config.log_level = :info edit-inconfig/environments/performance.rb

Bekerja dengan baik untuk saya, menolak output SQL, dan hanya menampilkan informasi rendering dan penting.

Nate Ben
sumber
Saya menggunakan 4.1.0 dan itu bekerja dengan baik untuk saya. terima kasih
Zakaria
4

Di Rails 3.2 saya melakukan sesuatu seperti ini di config / environment / development.rb:

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

Sama seperti FYI, di Rails 2 Anda bisa melakukannya

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

Jelas kurung kurawal dapat diganti dengan do endbalok jika Anda mau.

Max Williams
sumber