Konsolda Rails SQL günlük kaydını devre dışı bırak


262

Konsolda komutları yürütürken SQL sorgu günlüğünü devre dışı bırakmanın bir yolu var mı? İdeal olarak, sadece devre dışı bırakıp konsoldaki bir komutla yeniden etkinleştirebilirsem harika olurdu.

Bir şey hata ayıklama ve bazı ilgili verileri yazdırmak için "koyar" kullanarak çalışıyorum. Ancak, sql sorgu çıktısı okumayı zorlaştırıyor.


Düzenleme: Eğer kodum dışında bir şey logger.warn çağırmak çalıştı, nil için logger bazen bir hata kaldırdı çünkü başka bir çözüm buldum

Kaydediciyi ayarlamak yerine günlükçünün nilseviyesini ayarlayabilirsiniz 1.

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

since setting the logger to nil sometimes raised an erroryap .. Bunu rake db:migrate stackoverflow.com/questions/1719212/…
abbood

3
Bunun bir başlatıcıda Rails 4.1.0'da çalıştığını onaylama.
Amal Chaudhuri

Yanıtlar:


314

Kapatmak için:

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

Tekrar açmak için:

ActiveRecord::Base.logger = old_logger

1
SQL çıkışını kalıcı olarak devre dışı bırakabileceğim herhangi bir yer var mı? Ben envs / dev.rb eklemeyi denedim ama şans değil.
samvermette

5
.irbrctemel .bashrcolarak Rails konsolu için olan bu kodu koyabilirsiniz . Aslında istediğiniz her şeyi yapabilirsiniz .irbrc, örneğin sözdizimi renklendirme, geçmiş, vi'da kodu düzenleyin ve sonra Rails konsolunda yürütün, vb utility_belt. Ruby 1.8 veya Ruby 1.9 bağlantı noktasındaysanız gemimi kontrol edin denilenflyrb
Giles Bowkett

2
@giles bowkett: Aslında .irbrcgibidir .bashrcama aslında için yakut interaktif komut. Bir ray şey değil. Bir rab ortamının dışında irb çalıştırırken rails sınıflarına başvurmaya çalışırsanız muhtemelen hatalar alacağınızı düşünüyorum.
eremzeit

9
@ samvermette bir yapılandırma dosyasında yapabilirsiniz. Örneğin:config/initializers/activerecord_logger.rb
Uri

15
ActiveRecord::Base.logger.level = 1.info ve diğerlerini kullanırsanız istisnalar yaratmayacağından çok daha iyi bir yanıttır.
Kirli Henry

72

İşte biraz daha temiz olduğunu düşündüğüm bir varyasyon, yine de AR'den potansiyel diğer günlüklere izin veriyor. Config / environment / development.rb dosyasında:

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

Rails, benim için değil, Rails 3.0 veya 3.1'de. Rails.logger'ınız bir after_initialize bloğunda nil olabilir, Rails init yığınınızı özelleştirmek için başka bir şey yaptınız mı ya da config.after_initialize öğesini unuttunuz mu?
jrochkind

1
Benim Rails 3.1 uygulamasında harika çalışıyor. Seemsl gibi en güzel çözüm. +1
Martijn

Benim için çalışmıyor ... after_initialize bloğunda OK seviyesini ayarlar, ancak konsol açıldığında seviye 0'a döner. Garip. (Pry'yi konsol yerine kullanıyorum, bu yüzden mi?)
Mike Blyth

63

Bu konsol için uygun bir çözüm olmayabilir, ancak Rails'in bu sorun için bir yöntemi vardır: Logger # silence

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

4
Yalnızca Rails 3'e kadar çalışacaktır: "DEPRECATION UYARI: sessizlik kullanımdan kaldırılmıştır ve Rails 4.0'dan kaldırılacaktır"
Kangur

6
@Kangur Ben raylar 4.2'deyim ve sessizlik iyi çalışıyor gibi görünüyor
Benjamin Crouzier

2
@Kangur Bu yaklaşımın Rails 4.2
Greg Matthew Crossley'de de

6
Rails 5'de çalışıyor ve hiçbir uyarı görmüyorum. Bu en iyi cevap IMO.
Aşırı

1
Rails 6'da iyi çalışıyor. Belki sadece biraz hareket ettirildi?
johncip

16

Rails 4 için aşağıdakileri bir ortam dosyasına koyabilirsiniz:

# /config/environments/development.rb

config.active_record.logger = nil

Bu sadece loglama çoğunlukla baskılanan üretimde etkili olacaktır ....
Rob

13

Birisinin SQL deyimi günlüğünü gerçekten çıkarmak istediği durumda (günlük kaydı düzeyini değiştirmeden ve günlük kaydını AR modellerinden korurken):

(Zaten Raylar 3.2.16 cinsinden) günlüğüne yazar hat için çağrıdır debugiçinde lib/active_record/log_subscriber.rb:50.

Bu hata ayıklama yöntemi ile tanımlanır ActiveSupport::LogSubscriber.

Böylece, üzerine yazarak günlüğü kapatabiliriz:

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

İyi bir. Bu, Rails.logger.debugifadeleri etkilemeden SQL günlüğü üzerinde çalışır .
Teemu Leisti

Toplam çaylak burada. Bunu tam olarak nereye koymalıyız?
devius

Ben lib / monkeypatch.rb tutmak ve sahip raylar config / application.rb aşağıdaki satırla bunu çekin: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Maymun oyununun bazılarının kaşlarını çattığını unutmayın. Muhtemelen bunu üretim kodunuzda kontrol etmemelisiniz.
fakeleft

8

Bunu kullandım: config.log_level = :info edit-inconfig/environments/performance.rb

Benim için harika çalışıyor, SQL çıktısını reddediyor ve sadece oluşturma ve önemli bilgileri gösteriyor.


4.1.0 raylarındayım ve benim için iyi çalıştı. teşekkürler
Zakaria

4

Rails 3.2 ben config / environment / development.rb böyle bir şey yapıyorum:

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

2

Tıpkı bir FYI gibi, Rails 2'de

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

Açıkçası, isterseniz kıvırcık ayraçlar bir do endblokla değiştirilebilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.