Wyłącz logowanie w Rails SQL w konsoli

262

Czy istnieje sposób na wyłączenie rejestrowania zapytań SQL, gdy wykonuję polecenia w konsoli? Idealnie byłoby świetnie, gdybym mógł po prostu wyłączyć i ponownie włączyć za pomocą polecenia w konsoli.

Próbuję coś debugować i za pomocą polecenia „puts” wypisuję odpowiednie dane. Jednak dane wyjściowe zapytania SQL utrudniają odczytanie.


Edycja: Znalazłem inne rozwiązanie, ponieważ ustawienie loggera na zero czasami powodowało błąd, jeśli coś innego niż mój kod próbował wywołać logger.warn

Zamiast ustawiać rejestrator na nil, możesz ustawić poziom rejestratora na 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
gylaz
źródło
since setting the logger to nil sometimes raised an erroryap .. Mam ten przy próbie uruchomienia rake db:migrate stackoverflow.com/questions/1719212/…
abbood
3
Potwierdzenie, że działa to w Rails 4.1.0 w inicjalizatorze.
Amal Chaudhuri

Odpowiedzi:

314

Aby to wyłączyć:

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

Aby ponownie włączyć:

ActiveRecord::Base.logger = old_logger
Ryan Bigg
źródło
1
Czy mogę gdziekolwiek to umieścić, aby trwale wyłączyć wyjście SQL? Próbowałem dodać go do envs / dev.rb, ale nie miałem szczęścia.
samvermette,
5
możesz wstawić ten kod .irbrc, który jest w zasadzie .bashrcdla konsoli Rails. w rzeczywistości możesz zrobić wszystko, .irbrcjeśli chcesz, np. kolorowanie składni, historię, edycję kodu w vi, a następnie wykonanie go w konsoli Rails itp. sprawdź mój klejnot, utility_beltjeśli korzystasz z Ruby 1.8 lub Ruby 1.9 o nazwieflyrb
Giles Bowkett,
2
@giles Bowkett: Właściwie, .irbrcto jak .bashrc, ale rzeczywiście za rubinowym interaktywnej poleceń. To nie jest sprawa szyn. Wyobrażam sobie, że prawdopodobnie wystąpiłyby błędy, gdybyś próbował odwoływać się do klas szyn, gdy działałeś IRB poza środowiskiem szyn.
eremzeit,
9
@samvermette można to zrobić w pliku konfiguracyjnym. Na przykład:config/initializers/activerecord_logger.rb
Uri
15
ActiveRecord::Base.logger.level = 1jest znacznie lepszą odpowiedzią, ponieważ nie spowoduje wyjątków, jeśli użyjesz .info i innych.
Dirty Henry
72

Oto wariant, który uważam za nieco czystszy, który wciąż pozwala na potencjalne inne logowanie z AR. W config / environment / development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
jrochkind
źródło
Dziwne, nie dla mnie, w Railsach 3.0 lub 3.1. Dlaczego Twój Rails.logger miałby zero w bloku after_initialize, czy zrobiłeś coś innego, aby dostosować swój stos inicjacyjny Railsów, czy zapomniałeś config.after_initialize?
jrochkind
1
Działa świetnie w mojej aplikacji Rails 3.1. Wydaje się, że to najpiękniejsze rozwiązanie. +1
Martijn
Nie działa dla mnie ... ustawia poziom OK w bloku after_initialize, ale poziom wraca do 0 do czasu otwarcia konsoli. Dziwne. (Używam Pry jako zamiennika konsoli, czy dlatego?)
Mike Blyth,
63

To może nie być odpowiednie rozwiązanie dla konsoli, ale Railsy mają metodę na ten problem: Logger # silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
Christoph Petschnig
źródło
4
Będzie działać tylko przez okres do szyny 3: „Wycofanie UWAGA: cisza jest przestarzała i zostanie usunięty z Rails 4.0”
Kangur
6
@Kangur Jestem na szynach 4.2 i cisza wydaje się działać dobrze
Benjamin Crouzier
2
@Kangur Mogę również potwierdzić, że to podejście działa dobrze na szynach 4.2
Greg Matthew Crossley,
6
Działa w Rails 5 i nie widzę ostrzeżeń. To najlepsza odpowiedź IMO.
Przeciążenie 119
1
Działa dobrze w Rails 6. Może po prostu został trochę przeniesiony?
Jan
16

W przypadku Rails 4 możesz umieścić w pliku środowiska:

# /config/environments/development.rb

config.active_record.logger = nil
Micheasz
źródło
Miałoby to wpływ tylko na produkcję, gdzie i tak wycinanie drewna jest w większości powstrzymywane ...
Rob
13

W przypadku gdy ktoś chce rzeczywiście wybić rejestrowanie instrukcji SQL (bez zmiany poziomu rejestrowania i przy zachowaniu rejestrowanie ze swoich modeli AR):

Linia, która pisze w dzienniku (w Rails 3.2.16, w każdym razie) jest wywołanie debugwlib/active_record/log_subscriber.rb:50 .

Ta metoda debugowania jest zdefiniowana przez ActiveSupport::LogSubscriber .

Abyśmy mogli wyeliminować rejestrowanie, nadpisując je w następujący sposób:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
fakeleft
źródło
Dobry. Działa to przy logowaniu SQL bez wpływu na Rails.logger.debuginstrukcje.
Teemu Leisti
Całkowity noob tutaj. Gdzie dokładnie to powinniśmy umieścić?
devius
Trzymam go w lib / monkeypatch.rb i szyny mają ciągnąć go z poniższej linii w config / environment.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Należy pamiętać, że niektórzy nie znoszą łapania małp. Prawdopodobnie nie powinien tego sprawdzać w kodzie produkcyjnym.
fakeleft
8

Użyłem tego: config.log_level = :info edycjaconfig/environments/performance.rb

Działa świetnie dla mnie, odrzucając dane wyjściowe SQL i pokazuje tylko rendering i ważne informacje.

Nate Ben
źródło
Jestem na szynach 4.1.0 i działa dobrze dla mnie. dzięki
Zakaria,
4

W Rails 3.2 robię coś takiego w 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
źródło
2

Podobnie jak w przypadku FYI, w Rails 2 możesz to zrobić

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

Oczywiście, do endjeśli chcesz, kręcone szelki można zastąpić blokiem.

Max Williams
źródło