312 votes

Désactiver la journalisation SQL de Rails dans la console

Existe-t-il un moyen de désactiver la journalisation des requêtes SQL lorsque j'exécute des commandes dans la console ? Idéalement, il faudrait que je puisse la désactiver et la réactiver par une commande dans la console.

J'essaie de déboguer quelque chose et j'utilise "puts" pour imprimer des données pertinentes. Cependant, la sortie de la requête sql est difficile à lire.


Edit : J'ai trouvé une autre solution, puisque mettre le logger à nil soulevait parfois une erreur, si quelque chose d'autre que mon code essayait d'appeler logger.warn

Au lieu de définir le logger sur nil vous pouvez régler le niveau de l'enregistreur sur 1 .

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

0 votes

since setting the logger to nil sometimes raised an error yap J'ai eu celui-là en essayant d'exécuter rake db:migrate stackoverflow.com/questions/1719212/

3 votes

Je confirme que cela fonctionne dans Rails 4.1.0 dans un initialisateur.

373voto

Ryan Bigg Points 64561

Pour l'éteindre :

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

Pour le remettre en marche :

ActiveRecord::Base.logger = old_logger

1 votes

Y a-t-il un endroit où je peux mettre cela pour désactiver la sortie SQL de façon permanente ? J'ai essayé de l'ajouter à envs/dev.rb mais sans succès.

0 votes

@samvermette, vous ne le réglez pas. Il suffit de l'appeler depuis la console avant de faire votre travail.

7 votes

Vous pouvez mettre ce code dans .irbrc qui est en fait .bashrc pour la console Rails. En fait, vous pouvez faire à peu près n'importe quoi en .irbrc si vous voulez, par exemple, la coloration syntaxique, l'historique, éditer du code dans vi puis l'exécuter dans la console Rails, etc. consultez ma gemme utility_belt si vous êtes sous Ruby 1.8 ou le portage Ruby 1.9 appelé flyrb

96voto

Ce n'est peut-être pas une solution adaptée à la console, mais Rails a une méthode pour ce problème : Logger#silence

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

4 votes

Ne fonctionne que jusqu'à Rails 3 : "DEPRECATION WARNING : silence is deprecated and will be removed from Rails 4.0".

7 votes

@Kangur Je suis sur rails 4.2 et le silence semble fonctionner correctement.

3 votes

@Kangur Je peux également confirmer que cette approche fonctionne parfaitement avec Rails 4.2.

82voto

jrochkind Points 4170

Voici une variation que je considère un peu plus propre, qui permet encore d'autres exploitations potentielles de l'AR. Dans config/environnements/development.rb :

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

0 votes

Bizarre, pas pour moi, dans Rails 3.0 ou 3.1. Pourquoi votre Rails.logger serait-il nul dans un bloc after_initialize, avez-vous fait quelque chose d'autre pour personnaliser votre pile init Rails, ou avez-vous oublié le config.after_initialize ?

1 votes

Fonctionne très bien dans mon application Rails 3.1. Cela semble être la meilleure solution. +1

0 votes

Ne fonctionne pas pour moi ... définit le niveau OK dans le bloc after_initialize, mais le niveau est de nouveau à 0 au moment où la console est ouverte. C'est étrange. (J'utilise Pry pour remplacer la console, c'est pour ça ?)

27voto

Micah Points 509

Pour Rails 4, vous pouvez mettre ce qui suit dans un fichier d'environnement :

# /config/environments/development.rb

config.active_record.logger = nil

16voto

fakeleft Points 903

Au cas où quelqu'un voudrait en fait supprimer la journalisation des instructions SQL (sans modifier le niveau de journalisation, et en conservant la journalisation de leurs modèles AR) :

La ligne qui écrit dans le journal (dans Rails 3.2.16, en tout cas) est l'appel à debug en lib/active_record/log_subscriber.rb:50 .

Cette méthode de débogage est définie par ActiveSupport::LogSubscriber .

On peut donc supprimer la journalisation en l'écrasant comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X