Disabilita la registrazione Rails SQL nella console


262

Esiste un modo per disabilitare la registrazione delle query SQL quando eseguo i comandi nella console? Idealmente, sarebbe fantastico se posso semplicemente disabilitarlo e riattivarlo con un comando nella console.

Sto provando a eseguire il debug di qualcosa e usando "put" per stampare alcuni dati rilevanti. Tuttavia, l'output della query sql rende difficile la lettura.


Modifica: ho trovato un'altra soluzione, poiché l'impostazione del logger su zero a volte ha generato un errore, se qualcosa di diverso dal mio codice ha provato a chiamare logger.warn

Invece di impostare il logger su nilè possibile impostare il livello del logger su 1.

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

since setting the logger to nil sometimes raised an errorYap .. Ho ottenuto questo uno quando si tenta di eseguire rake db:migrate stackoverflow.com/questions/1719212/...
abbood

3
Confermando che funziona in Rails 4.1.0 in un inizializzatore.
Amal Chaudhuri,

Risposte:


314

Per disattivarlo:

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

Per riattivarlo:

ActiveRecord::Base.logger = old_logger

1
C'è un posto dove posso metterlo in modo da disabilitare l'output SQL in modo permanente? Ho provato ad aggiungerlo a envs / dev.rb ma non per fortuna.
Samvermette,

5
puoi inserire questo codice .irbrc, che è fondamentalmente .bashrcper la console di Rails. infatti puoi fare praticamente tutto .irbrcse vuoi, ad es. colorazione della sintassi, cronologia, modifica codice in vi e quindi eseguilo nella console Rails, ecc. controlla la mia gemma utility_beltse sei su Ruby 1.8 o la porta Ruby 1.9 chiamaflyrb
Giles Bowkett il

2
@giles bowkett: In realtà, .irbrcè come .bashrcma in realtà per la tua riga di comando interattiva ruby . Non è una cosa rotaia. Immagino che avresti probabilmente avuto degli errori se avessi provato a fare riferimento alle classi di rails mentre stavi eseguendo irb al di fuori di un ambiente di rails.
eremzeit,

9
@samvermette puoi farlo in un file di configurazione. Ad esempio:config/initializers/activerecord_logger.rb
Uri,

15
ActiveRecord::Base.logger.level = 1è una risposta molto migliore in quanto non genererà eccezioni se usi .info e altri.
Dirty Henry,

72

Ecco una variazione che ritengo un po 'più pulita, che consente ancora potenziali altre registrazioni dall'AR. In config / environment / development.rb:

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

Strano, non per me, in Rails 3.0 o 3.1. Perché Rails.logger dovrebbe essere nullo in un blocco after_initialize, hai fatto qualcos'altro per personalizzare il tuo stack di inizializzazione di Rails o hai dimenticato config.after_initialize?
jrochkind,

1
Funziona alla grande nella mia app Rails 3.1. Sembra la soluzione migliore. +1
Martijn

Non funziona per me ... imposta il livello OK nel blocco after_initialize, ma il livello torna a 0 quando la console è aperta. Strano. (Sto usando Pry come sostituto della console, è per questo?)
Mike Blyth il

63

Questa potrebbe non essere una soluzione adatta per la console, ma Rails ha un metodo per questo problema: Logger # silenzio

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

4
Funzionerà solo per Rails 3: "AVVISO DI DEPRECAZIONE: il silenzio è deprecato e verrà rimosso da Rails 4.0"
Kangur

6
@Kangur Sono su rotaie 4.2 e il silenzio sembra funzionare bene
Benjamin Crouzier,

2
@Kangur Posso anche confermare che questo approccio funziona perfettamente su Rails 4.2
Greg Matthew Crossley,

6
Funziona in Rails 5 e non vedo avvisi. Questa è la migliore risposta IMO.
Sovraccarico119

1
Funziona bene in Rails 6. Forse è stato appena spostato un po '?
Giovanni

16

Per Rails 4 puoi inserire quanto segue in un file di ambiente:

# /config/environments/development.rb

config.active_record.logger = nil

Ciò avrebbe effetto solo in produzione, dove comunque il disboscamento è per lo più sorpreso ....
Rob,

13

Nel caso in cui qualcuno desideri effettivamente eliminare la registrazione delle istruzioni SQL (senza modificare il livello di registrazione e mantenendo la registrazione dai loro modelli AR):

La linea che scrive nel registro (in Rails 3.2.16, comunque) è la chiamata a debugin lib/active_record/log_subscriber.rb:50.

Quel metodo di debug è definito da ActiveSupport::LogSubscriber.

Quindi possiamo eliminare la registrazione sovrascrivendola in questo modo:

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

Buona Funziona con la registrazione SQL senza influire sulle Rails.logger.debugistruzioni.
Teemu Leisti,

Noob totale qui. Dove esattamente dovremmo metterlo?
devius,

Lo tengo in lib / monkeypatch.rb e hanno rotaie tirano con la seguente riga in config / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Tieni presente che il monkeypatching è disapprovato da alcuni. Probabilmente non dovresti controllare questo nel tuo codice di produzione.
fakeleft,

8

Ho usato questo: config.log_level = :info edit-inconfig/environments/performance.rb

Funziona benissimo per me, respinge l'output SQL e mostra solo rendering e informazioni importanti.


Sono su rotaie 4.1.0 e ha funzionato bene per me. grazie
Zakaria il

4

In Rails 3.2 sto facendo qualcosa del genere 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

2

Proprio come un FYI, in Rails 2 puoi farlo

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

Ovviamente le parentesi graffe potrebbero essere sostituite con un do endblocco se lo si desidera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.