当我在控制台中执行命令时,是否有方法禁用SQL查询日志记录?理想情况下,如果我可以禁用它,并在控制台中使用命令重新启用它,那就太好了。

我试图调试一些东西,并使用“放”打印出一些相关数据。但是,sql查询输出使其难以阅读。


编辑: 我找到了另一个解决方案,因为设置记录器为nil有时会引发一个错误,如果我的代码之外的东西试图调用logger.warn

您可以将记录器的级别设置为1,而不是将记录器设置为nil。

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

关闭:

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

打开它:

ActiveRecord::Base.logger = old_logger

这里有一个我认为比较干净的变化,它仍然允许在配置/环境/开发中从AR中进行潜在的其他日志记录。rb:

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

对于控制台来说,这可能不是一个合适的解决方案,但是Rails有一个解决这个问题的方法:Logger#silence

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

在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

如果有人真的想要取消SQL语句日志记录(不改变日志级别,同时保持从他们的AR模型的日志记录):

写入日志的行(至少在Rails 3.2.16中)是lib/active_record/log_subscriber.rb:50中的调试调用。

该调试方法由ActiveSupport::LogSubscriber定义。

所以我们可以像这样重写日志:

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

对于Rails 4,你可以在环境文件中放入以下内容:

# /config/environments/development.rb

config.active_record.logger = nil

我使用这个:config.log_level =:info 编辑配置/环境/ performance.rb

工作对我来说很棒,拒绝SQL输出,只显示渲染和重要信息。


仅供参考,在Rails 2中你可以这样做

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

显然,如果你愿意,花括号可以用do end块代替。


我必须解决这个ActiveRecord 6,我基于我的答案假左的响应,但它不是很正确,因为它抑制了其他日志记录,如嵌套视图的日志记录。我所做的是创建config/initializers/activerecord_logger.rb:

# Suppress SQL statement logging if necessary
# This is a dirty, dirty trick, but it works:
if ENV["ACTIVERECORD_HIDE_SQL"].present?
  module ActiveRecord
    class LogSubscriber
      def sql(event)
      end
    end
  end
end

AR 6中的日志订阅者有一个我们想要隐藏的sql事件,因此这非常有针对性地跳过该事件。


我使用activerecord 6.0.3.3,我必须包括ActiveSupport::LoggerSilence

include ActiveSupport::LoggerSilence

ActiveSupport::LoggerSilence.silence do
    ## everything you want to silence
end

然而,这并不适用于创建或删除SQL表,如ActiveRecord::Migration.drop_table。为了消除这种声音,我补充说:

ActiveRecord::Schema.verbose = false