如何在加载设备时禁用ActiveRecord查询日志记录



我有一个Rails应用程序,它的测试加载了大量的fixture。

加载这些fixture会生成大量的ActiveRecord SQL日志(每个INSERT查询一个,包括整个fixture内容(。这些日志会向logs/test.log文件发送垃圾邮件,并使浏览日志变得非常不方便。

如何防止SQL fixture日志向测试日志发送垃圾邮件?

由于Rails的日志记录级别现在对所有环境都是:debug,ActiveRecord SQL查询确实会在测试期间记录,包括在加载fixture时。

解决方案可以是在测试期间完全禁用ActiveRecord SQL日志。为此,只需设置ActiveRecord::Base.logger.level = :info就足够了
但是,即使在实际测试期间,您也不会看到任何SQL日志。这些日志非常方便,例如可以快速查看执行了哪些SQL请求以及执行了多少SQL请求。

更细粒度的解决方案是重载ActiveRecord::FixtureSet.create_fixtures,仅禁用此方法的SQL日志。可以通过在ActiveRecord::FixtureSet:中插入自定义模块来完成

# Add this to the bottom of your tests/test_helper.rb file.
module FixturesLogSilencer
extend ActiveSupport::Concern
class_methods do
# Remove fixtures creation queries from test logs, even when config.log_level = :debug
def create_fixtures(fixtures_directory, fixture_set_names, *args)
ActiveRecord::Base.logger.silence(:info) do
Rails.benchmark 'Loading fixtures', level: :info do
super
end
end
end
end
end
class ActiveRecord::FixtureSet
prepend FixturesLogSilencer
end

(此片段的最新版本可在https://gist.github.com/kemenaran/cfc820487a62e592dfda196903b6e10c)

之后,您的test.log文件只包含一行,而不是所有fixture SQL日志,如:

Loading fixtures… (395ms)

相关内容

  • 没有找到相关文章

最新更新