在控制台中禁用Rails SQL日志

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

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


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

与其将记录器设置为nil,不如将记录器的级别设置为1

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
120929 次浏览

关闭:

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有一个方法来解决这个问题:记录器#沉默

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中对debug的调用。

该调试方法由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 编辑config/environments/performance.rb < / p >

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

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

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

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

我必须解决这个ActiveRecord 6,我基于我的答案fakeleft的响应,但它不是很正确,因为它抑制了其他日志记录,如嵌套视图的日志记录。我所做的是创建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

ar6中的日志订阅者有一个我们想要隐藏的sql事件,所以这是非常狭隘的目标,以跳过事件。

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

include ActiveSupport::LoggerSilence


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

然而,这并不适用于任何与创建或删除诸如ActiveRecord::Migration.drop_table这样的SQL表相关的事情。为了消除这种声音,我补充说:

ActiveRecord::Schema.verbose = false