问题 如何在测试中关闭Rails SQL日志记录?


由于某种原因(可能是更新的gem),Rails现在正在记录我的所有SQL命令。我运行自动测试,他们在测试期间也被发送垃圾邮件。我该如何关闭它?

我尝试将此添加到config / environments / test.rb但它不起作用。 logger 已经 nil

# ActiveRecord::Base.logger = nil
# ActiveRecord::Base.logger.level = 1

Rails 4.0.0


11038
2018-02-15 02:15


起源

跑 grep -r 'config.logger' . 在你的项目中,看看它的设置。 - franksort
这是唯一的结果: config/environments/production.rb: # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - Chloe


答案:


好的,我找到了。这工作:

config.after_initialize do
  ActiveRecord::Base.logger = nil
end

13
2018-02-15 02:28



这对于限制所有日志记录非常棒,但我只想限制SQL日志记录,类似于LOG4J中的类别?我还使用跟踪/调试日志记录,并且不想关闭它。是否可以使用Rails日志记录,或者我是否必须使用LOG4R才能获得这种粒度记录? - alwynd
@alwynd ActiveRecord 只记录SQL。其他日志记录不受此影响。看看是否其他东西正在关闭它。 - Chloe


您可以做的另一件事是在运行时调用此代码,它不需要在配置文件中。

例如,如果您输入特定的测试用例

# test/functionals/application_controller_test.rb for example
ActiveRecord::Base.logger = nil

它也可以正常工作,这样你就可以在运行时切换它。如果您只想扼杀几行代码或块,则非常有用。


2
2018-02-15 03:45





如果有人想要 其实 淘汰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

1
2018-01-31 01:54