コンソールでRails SQLロギングを無効にする


262

コンソールでコマンドを実行しているときにSQLクエリのログを無効にする方法はありますか?理想的には、それを無効にして、コンソールのコマンドで再度有効にできると便利です。

私は何かをデバッグしようとしていて、「プット」を使用して関連データを出力しています。ただし、sqlクエリの出力により、読みにくくなっています。


編集: 別の解決策を見つけました。ロガーをnilに設定すると、コード以外のものがlogger.warnを呼び出そうとしたときにエラーが発生することがあったためです

ロガーを設定する代わりに、ロガーnilのレベルをに設定できます1

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

since setting the logger to nil sometimes raised an errorヤップ..私は実行しようとしているこのいずれかだrake db:migrate stackoverflow.com/questions/1719212/...
abbood

3
これが初期化子のRails 4.1.0で機能することを確認します。
Amal Chaudhuri 2014年

回答:


314

オフにするには:

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

オンに戻すには:

ActiveRecord::Base.logger = old_logger

1
これを配置できる場所があるので、SQL出力を永久に無効にしますか?私はそれをenvs / dev.rbに追加しようとしましたが、うまくいきませんでした。
samvermette 2011

5
このコードはに配置できます。.irbrcこれは基本的.bashrcにRailsコンソール用です。実際.irbrc、構文の色付け、履歴、viでのコードの編集、Railsコンソールでの実行など、必要に応じてほとんど何でもできますutility_belt。Ruby1.8またはRuby 1.9ポートを使用しているかどうか、gemを確認してください。呼ばれるflyrb
Giles Bowkett

2
@giles bowkett:実際、Rubyのインタラクティブなコマンドラインに.irbrc似て.bashrcいますが、実際はそうです。Railsのものではありません。Rails環境の外でirbを実行しているときにrailsクラスを参照しようとすると、おそらくエラーが発生すると思います。
eremzeit

9
@samvermetteあなたはそれを設定ファイルですることができます。例:config/initializers/activerecord_logger.rb
Uri

15
ActiveRecord::Base.logger.level = 1.infoなどを使用しても例外が発生しないため、はるかに良い答えです。
ダーティヘンリー

72

これは、私が多少クリーンだと考えるバリエーションですが、それでもARからの潜在的な他のロギングが可能です。config / environments / development.rbで:

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

Rails 3.0または3.1では、私にとっては奇妙です。Rails.loggerがafter_initializeブロックでnilになっているのはなぜですか?Railsの初期スタックをカスタマイズするために何か他のことをしたのですか、それともconfig.after_initializeを忘れましたか?
jrochkind

1
Rails 3.1アプリでうまく機能します。最高のソリューションのようです。+1
Martijn

動作しません... after_initializeブロックでレベルOKを設定しますが、コンソールが開いているときにはレベルは0に戻ります。奇妙な。(私はPryをコンソールの交換品として使用していますが、それはなぜですか?)
Mike Blyth

63

これはコンソールに適した解決策ではないかもしれませんが、Railsにはこの問題に対する方法があります:Logger#silence

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

4
Rails 3までのみ機能します:「非推奨の警告:無音は非推奨になり、Rails 4.0から削除されます」
Kangur

6
@Kangur私はレール4.2を使用していて、沈黙はうまく機能しているようです
Benjamin Crouzier

2
@Kangur私はまた、このアプローチがRails 4.2でうまく機能することを確認できます
Greg Matthew Crossley

6
Rails 5で動作し、警告は表示されません。これがIMOの最良の回答です。
過負荷

1
Rails 6で正常に動作します。たぶん少し動かされただけでしょうか?
johncip

16

Rails 4の場合は、環境ファイルに以下を配置できます。

# /config/environments/development.rb

config.active_record.logger = nil

それだけで....ロギングがほとんどとにかくsurpressedされ、生産に影響を取る
ロブ・

13

誰かが実際に SQLステートメントのロギングをノックアウトしたい場合(ロギングレベルを変更せずに、ARモデルからのロギングを維持しながら):

(とにかく、Railsの3.2.16で)ログに書き込む行はへの呼び出しですdebuglib/active_record/log_subscriber.rb:50

そのデバッグメソッドはによって定義されActiveSupport::LogSubscriberます。

したがって、次のように上書きすることで、ログをノックアウトできます。

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

いいね。これは、Rails.logger.debugステートメントに影響を与えずにSQLロギングで機能します。
Teemu Leisti

ここで合計noob。これを正確にどこに置けばよいのでしょうか。
devius 2016年

私はそれをlib / monkeypatch.rbに保持しており、config / application.rbの次の行でレールにそれを取り込みます:Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }。モンキーパッチングは、一部の人によって眉をひそめられていることを覚えておいてください。おそらくこれを本番コードにチェックインすべきではありません。
fakeleft

8

私はこれを使用しました:config.log_level = :info 編集config/environments/performance.rb

SQL出力を拒否し、レンダリングと重要な情報のみを表示して、私にとってはうまくいきました。


私はRails 4.1.0を使用していますが、問題なく動作しました。ありがとう
Zakaria

4

Rails 3.2では、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

参考までに、Rails 2では次のことができます

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

もちろん、do end必要に応じて中括弧をブロックに置き換えることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.