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

gyl*_*laz 245 sql console ruby-on-rails

当我在控制台中执行命令时,有没有办法禁用SQL查询日志记录?理想情况下,如果我可以禁用它并使用控制台中的命令重新启用它,那将是很棒的.

我正在尝试调试一些东西并使用"puts"打印出一些相关数据.但是,sql查询输出使其难以阅读.


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

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

ActiveRecord::Base.logger.level = 1 # or Logger::INFO
Run Code Online (Sandbox Code Playgroud)

Rya*_*igg 290

要关闭它:

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil
Run Code Online (Sandbox Code Playgroud)

要重新打开它:

ActiveRecord::Base.logger = old_logger
Run Code Online (Sandbox Code Playgroud)

  • `ActiveRecord :: Base.logger.level = 1`是一个更好的答案,因为如果你使用.info和其他人,它不会引发异常. (10认同)
  • @samvermette你可以在配置文件中.例如:`config/initializers/activerecord_logger.rb` (9认同)
  • 您可以将此代码放在`.irbrc`中,这对于Rails控制台基本上是`.bashrc`.事实上,如果你想要的话,你可以在`.irbrc`中做任何事情,比如语法着色,历史记录,在vi中编辑代码然后在Rails控制台中执行它等等.如果你正在使用,请检查我的gem`usebelt` Ruby 1.8或Ruby 1.9端口称为"flyrb" (4认同)
  • @giles bowkett:实际上,.irbrc就像.bashrc一样,但是实际上是针对_ruby_交互式命令行的。这不是铁轨。我想如果在Rails环境之外运行irb时尝试引用rails类,可能会出错。 (2认同)

jro*_*ind 69

这是我认为更清洁的一种变体,它仍允许从AR进行潜在的其他日志记录.在config/environments/development.rb中:

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end
Run Code Online (Sandbox Code Playgroud)


Chr*_*nig 55

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

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end
Run Code Online (Sandbox Code Playgroud)

  • @Kangur我在轨道4.2上,沉默似乎工作正常 (6认同)
  • 在Rails 5中工作,我看不到任何警告.这是IMO的最佳答案. (5认同)
  • 仅适用于Rails 3:"DEPRECATION WARNING:不推荐使用静默,将从Rails 4.0中删除" (4认同)
  • 在 Rails 6 中工作得很好。也许它只是被移动了一点? (3认同)
  • @Kangur我也可以确认这种方法在Rails 4.2上运行得很好 (2认同)

Mic*_*cah 14

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

# /config/environments/development.rb

config.active_record.logger = nil
Run Code Online (Sandbox Code Playgroud)

  • @Rob编辑为'开发'以避免混淆. (3认同)

fak*_*eft 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
Run Code Online (Sandbox Code Playgroud)

  • 好一个。这适用于 SQL 日志记录,而不影响 `Rails.logger.debug` 语句。 (2认同)

Nat*_*Ben 8

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

对我很有用,拒绝SQL输出,只显示渲染和重要信息.