在控制台中禁用Rails SQL日志记录


262

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

我正在尝试调试某些内容,并使用“ puts”打印一些相关数据。但是,SQL查询输出使其难以阅读。


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

除了将记录器设置为以外,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年

Answers:


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如果您使用的是Ruby 1.8或Ruby 1.9端口,请检查我的gem 被称为flyrb
Giles Bowkett 2012年

2
@giles bowkett:其实.irbrc就像.bashrc但实际上是针对您的ruby交互式命令行的。这不是铁轨。我想如果在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块中为零,您是否做了其他事情来自定义Rails初始化堆栈,还是忘记了config.after_initialize?
jrochkind 2011年

1
在我的Rails 3.1应用程序中运行良好。似乎是最好的解决方案。+1
马丁(Martijn)2012年

对我不起作用...在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 2013年

6
@Kangur我正处于4.2的轨道上,沉默似乎工作得很好
Benjamin Crouzier

2
@Kangur我也可以确认这种方法在Rails 4.2上可以正常工作
Greg Matthew Crossley,2016年

6
在Rails 5中工作,我看不到任何警告。这是IMO的最佳答案。
重载

1
在Rails 6中可以正常工作。也许只是稍微移动了一下?
johncip

16

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

# /config/environments/development.rb

config.active_record.logger = nil

那只会在生产中生效,因为无论如何伐木基本上都受到压制....
罗布(Rob)

13

如果有人想真正取消SQL语句日志记录(在不更改日志记录级别的情况下,同时保留其AR模型的日志记录):

写入日志的行(无论如何在Rails 3.2.16中)是对debugin 的调用lib/active_record/log_subscriber.rb:50

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

因此,我们可以通过覆盖日志来删除日志,如下所示:

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

好一个 这适用于SQL日志记录,而不会影响Rails.logger.debug语句。
Teemu Leisti 2015年

总菜鸟在这里。我们到底应该把它放在哪里?
devius

我把它放在LIB / monkeypatch.rb和有轨拉它在配置/ application.rb中如下行:Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }。请记住,某些人不喜欢猴子修补。可能不应将其检入生产代码中。
fakeleft

8

我用这个:config.log_level = :info 编辑config/environments/performance.rb

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


我正在使用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

就像FYI一样,在Rails 2中,您可以

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

显然,do end如果需要,大括号可以替换为大括号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.