Deaktivieren Sie die Rails SQL-Protokollierung in der Konsole

262

Gibt es eine Möglichkeit, die SQL-Abfrageprotokollierung zu deaktivieren, wenn ich Befehle in der Konsole ausführe? Im Idealfall wäre es großartig, wenn ich es einfach deaktivieren und mit einem Befehl in der Konsole wieder aktivieren könnte.

Ich versuche, etwas zu debuggen und verwende "Puts", um einige relevante Daten auszudrucken. Die Ausgabe der SQL-Abfrage erschwert jedoch das Lesen.


Bearbeiten: Ich habe eine andere Lösung gefunden, da das Setzen des Loggers auf Null manchmal einen Fehler auslöste, wenn etwas anderes als mein Code versuchte, logger.warn aufzurufen

Anstatt den Logger auf zu setzen nil, können Sie die Ebene des Loggers auf setzen 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
Gylaz
quelle
since setting the logger to nil sometimes raised an erroryap .. Ich habe dieses, als ich versuchte, rake db:migrate stackoverflow.com/questions/1719212/…
abbood
3
Bestätigen, dass dies in Rails 4.1.0 in einem Initialisierer funktioniert.
Amal Chaudhuri

Antworten:

314

So schalten Sie es aus:

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

So schalten Sie es wieder ein:

ActiveRecord::Base.logger = old_logger
Ryan Bigg
quelle
1
Kann ich dies irgendwo platzieren, um die SQL-Ausgabe dauerhaft zu deaktivieren? Ich habe versucht, es zu envs / dev.rb hinzuzufügen, aber kein Glück.
Samvermette
5
Sie können diesen Code eingeben .irbrc, der im Wesentlichen .bashrcfür die Rails-Konsole gilt. Tatsächlich können Sie so gut wie alles tun, .irbrcwenn Sie möchten, z. B. Syntaxfarbe, Verlauf, Code in vi bearbeiten und dann in der Rails-Konsole ausführen usw. Überprüfen Sie mein Juwel, utility_beltwenn Sie sich auf Ruby 1.8 oder dem Ruby 1.9-Port befinden genanntflyrb
Giles Bowkett
2
@giles bowkett: Eigentlich .irbrcist es .bashrcaber eigentlich für deine rubin interaktive Kommandozeile. Es ist keine Schienensache. Ich kann mir vorstellen, dass Sie wahrscheinlich Fehler bekommen würden, wenn Sie versuchen würden, auf Rails-Klassen zu verweisen, wenn Sie irb außerhalb einer Rails-Umgebung ausführen.
Eremzeit
9
@samvermette können Sie es in einer Konfigurationsdatei. Zum Beispiel:config/initializers/activerecord_logger.rb
Uri
15
ActiveRecord::Base.logger.level = 1ist eine viel bessere Antwort, da es keine Ausnahmen auslöst, wenn Sie .info und andere verwenden.
Schmutziger Henry
72

Hier ist eine Variante, die ich für etwas sauberer halte und die möglicherweise noch andere Protokollierungen von AR zulässt. In config / environment / development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
jrochkind
quelle
Seltsam, nicht für mich, in Rails 3.0 oder 3.1. Warum sollte Ihr Rails.logger in einem after_initialize-Block null sein, haben Sie etwas anderes getan, um Ihren Rails-Init-Stack anzupassen, oder haben Sie die config.after_initialize vergessen?
Jrochkind
1
Funktioniert hervorragend in meiner Rails 3.1 App. Scheint die schönste Lösung zu sein. +1
Martijn
Funktioniert bei mir nicht ... setzt die Ebene im Block after_initialize auf OK, aber die Ebene ist zum Zeitpunkt des Öffnens der Konsole wieder auf 0. Seltsam. (Ich benutze Pry als Konsolenersatz, ist das der Grund?)
Mike Blyth
62

Dies ist möglicherweise keine geeignete Lösung für die Konsole, aber Rails hat eine Methode für dieses Problem: Logger # Silence

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
Christoph Petschnig
quelle
4
Funktioniert nur für Rails 3: "DEPRECATION WARNING: Stille ist veraltet und wird aus Rails 4.0 entfernt"
Kangur
6
@ Kangur Ich bin auf Schienen 4.2 und Stille scheint gut zu funktionieren
Benjamin Crouzier
2
@ Kangur Ich kann auch bestätigen, dass dieser Ansatz auf Rails 4.2
Greg Matthew Crossley
6
Funktioniert in Rails 5 und ich sehe keine Warnungen. Dies ist die beste Antwort IMO.
Überladung119
1
Funktioniert gut in Rails 6. Vielleicht wurde es nur ein bisschen verschoben?
Johncip
16

Für Rails 4 können Sie Folgendes in eine Umgebungsdatei einfügen:

# /config/environments/development.rb

config.active_record.logger = nil
Micah
quelle
Das würde nur in der Produktion wirksam werden, wo die Protokollierung sowieso meistens unterdrückt wird ...
Rob
13

Für den Fall, dass jemand die Protokollierung von SQL-Anweisungen tatsächlich ausschalten möchte (ohne die Protokollierungsstufe zu ändern und die Protokollierung von seinen AR-Modellen beizubehalten):

Die Zeile, die in das Protokoll schreibt (jedenfalls in Rails 3.2.16), ist der Aufruf von debugin lib/active_record/log_subscriber.rb:50.

Diese Debug-Methode ist definiert durch ActiveSupport::LogSubscriber.

So können wir die Protokollierung ausschalten, indem wir sie wie folgt überschreiben:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
fakeleft
quelle
Gut. Dies funktioniert bei der SQL-Protokollierung, ohne die Rails.logger.debugAnweisungen zu beeinflussen .
Teemu Leisti
Total noob hier. Wo genau sollen wir das hinstellen?
Devius
Ich behalte es in lib / monkeypatch.rb und lasse es von Schienen mit der folgenden Zeile in config / application.rb ziehen : Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Denken Sie daran, dass Monkeypatching von manchen missbilligt wird. Sollte dies wahrscheinlich nicht in Ihren Produktionscode einchecken.
Fakeleft
8

Ich habe das benutzt: config.log_level = :info edit-inconfig/environments/performance.rb

Funktioniert hervorragend für mich, lehnt SQL-Ausgaben ab und zeigt nur Rendering und wichtige Informationen an.

Nate Ben
quelle
Ich bin auf Schienen 4.1.0 und es hat gut für mich funktioniert. danke
Zakaria
4

In Rails 3.2 mache ich so etwas in 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
quelle
2

Genau wie zu Ihrer Information können Sie dies in Rails 2 tun

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

Natürlich könnten die geschweiften Klammern durch einen do endBlock ersetzt werden, wenn Sie möchten.

Max Williams
quelle