Désactiver la journalisation SQL de Rails dans la console

262

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, ce serait génial si je pouvais simplement le désactiver et le réactiver avec une commande dans la console.

J'essaie de déboguer quelque chose et d'utiliser "met" pour imprimer des données pertinentes. Cependant, la sortie de la requête SQL rend la lecture difficile.


Edit: j'ai trouvé une autre solution, car la définition de l'enregistreur sur nil soulevait parfois une erreur, si autre chose que mon code essayait d'appeler logger.warn

Au lieu de définir l'enregistreur sur nilvous pouvez définir le niveau de l'enregistreur sur 1.

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
gylaz
la source
since setting the logger to nil sometimes raised an erroryap .. J'ai eu celui-ci en essayant d'exécuter rake db:migrate stackoverflow.com/questions/1719212/…
abbood
3
Confirmer que cela fonctionne dans Rails 4.1.0 dans un initialiseur.
Amal Chaudhuri

Réponses:

314

Pour le désactiver:

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

Pour le réactiver:

ActiveRecord::Base.logger = old_logger
Ryan Bigg
la source
1
Y a-t-il un endroit où je peux mettre cela afin de désactiver définitivement la sortie SQL? J'ai essayé de l'ajouter à envs / dev.rb mais pas de chance.
samvermette
5
vous pouvez mettre ce code .irbrc, qui est essentiellement .bashrcpour la console Rails. en fait, vous pouvez faire n'importe quoi .irbrcsi vous le souhaitez, par exemple, la coloration de la syntaxe, l'historique, éditer le code dans vi, puis l'exécuter dans la console Rails, etc. consultez mon bijou utility_beltsi vous êtes sur Ruby 1.8 ou le port Ruby 1.9 appeléflyrb
Giles Bowkett
2
@giles bowkett: En fait, .irbrcc'est comme .bashrcmais en fait pour votre ligne de commande interactive ruby . Ce n'est pas une affaire de rails. J'imagine que vous obtiendrez probablement des erreurs si vous essayez de référencer des classes de rails lorsque vous exécutez irb en dehors d'un environnement de rails.
eremzeit
9
@samvermette vous pouvez le faire dans un fichier de configuration. Par exemple:config/initializers/activerecord_logger.rb
Uri
15
ActiveRecord::Base.logger.level = 1est une bien meilleure réponse car elle ne soulèvera pas d'exceptions si vous utilisez .info et d'autres.
Dirty Henry
72

Voici une variante que je considère un peu plus propre, qui permet toujours d'autres enregistrements potentiels de AR. Dans config / environnements / development.rb:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
jrochkind
la source
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 autre chose pour personnaliser votre pile d'initialisation Rails, ou avez-vous oublié le config.after_initialize?
jrochkind
1
Fonctionne très bien dans mon application Rails 3.1. Seemsl comme la meilleure solution. +1
Martijn
Ne fonctionne pas pour moi ... définit le niveau OK dans le bloc after_initialize, mais le niveau est de retour à 0 au moment où la console est ouverte. Étrange. (J'utilise Pry comme remplacement de console, est-ce pourquoi?)
Mike Blyth
63

Ce n'est peut-être pas une solution appropriée pour 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
Christoph Petschnig
la source
4
Ne fonctionnera que jusqu'à Rails 3: "AVERTISSEMENT DE DÉPRÉCIATION: le silence est obsolète et sera supprimé de Rails 4.0"
Kangur
6
@Kangur Je suis sur les rails 4.2 et le silence semble bien fonctionner
Benjamin Crouzier
2
@Kangur Je peux également confirmer que cette approche fonctionne très bien sur Rails 4.2
Greg Matthew Crossley
6
Fonctionne dans Rails 5 et je ne vois aucun avertissement. C'est la meilleure réponse de l'OMI.
Overload119
1
Fonctionne bien dans Rails 6. Peut-être qu'il a juste été déplacé un peu?
johncip
16

Pour Rails 4, vous pouvez mettre les éléments suivants dans un fichier d'environnement:

# /config/environments/development.rb

config.active_record.logger = nil
Michée
la source
Cela ne prendrait effet qu'en production, où l'exploitation forestière est de toute façon la plupart du temps surpressée ...
Rob
13

Dans le cas où quelqu'un veut vraiment mettre KO l' enregistrement de l' instruction SQL (sans changer le niveau de l' exploitation forestière, et tout en gardant l'enregistrement de leurs modèles AR):

La ligne qui écrit dans le journal (dans Rails 3.2.16, de toute façon) est l'appel à debugin lib/active_record/log_subscriber.rb:50.

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

Nous pouvons donc éliminer la journalisation en la remplaçant comme suit:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end
fakeleft
la source
Bon. Cela fonctionne sur la journalisation SQL sans affecter les Rails.logger.debuginstructions.
Teemu Leisti
Noob total ici. Où devrions-nous mettre cela exactement?
devius
Je le garde dans lib / monkeypatch.rb et ont des rails tirez avec la ligne suivante dans config / application.rb: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }. Gardez à l'esprit que le monkeypatching est mal vu par certains. Ne devrait probablement pas vérifier cela dans votre code de production.
fakeleft
8

J'ai utilisé ceci: config.log_level = :info montageconfig/environments/performance.rb

Fonctionnant très bien pour moi, rejetant la sortie SQL et affichant uniquement le rendu et les informations importantes.

Nate Ben
la source
Je suis sur les rails 4.1.0 et cela a bien fonctionné pour moi. merci
Zakaria
4

Dans Rails 3.2, je fais quelque chose comme ça dans 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
la source
2

Tout comme un info, dans Rails 2, vous pouvez faire

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

Évidemment, les accolades pourraient être remplacées par un do endbloc si vous le vouliez.

Max Williams
la source