如何拦截ActiveRecord :: Base.logger输出?

时间:2014-12-03 16:39:44

标签: ruby ruby-on-rails-4 logging stream rails-console

上下文:我正在构建一个非常长的sql字符串并使用ActiveRecord执行它。当它失败时,它会记录错误(包括原始查询)并占用5页的屏幕空间。因为我已经捕获了异常,所以我不需要通知有错误,它只会使日志记录变得混乱。所有暂时关闭记录器或劫持IO流的尝试都是徒劳的。

问题:如何阻止记录该一个例外?

示例:(我知道很多代码都是多余的,但我的观点是,即使所有代码都不起作用)

really_long_query = "select * from posts where ..."
ActiveRecord::Base.logger.level = 10
$stderr = $stdout = $stdin = STDOUT = STDERR = STDIN = IO.new(IO.sysopen('/dev/null', 'w+'))

silence_stream(STDOUT){
    ActiveRecord::Base.connection.execute really_long_query # TURN LOGGING OFF FOR THIS LINE
} # => still logs the exception to the console, despite all the above code

我的结论:基于以上结果,我假设ActiveRecord必须使用

  1. 不同的记录器 AND
  2. 第3行未包含的流

1 个答案:

答案 0 :(得分:0)

ActiveRecord异常就像普通异常一样,你可以处理它们,所以请尝试:

begin
  sql = ActiveRecord::Base.connection.execute really_long_query
rescue => e
  # do what ever you want to do with error
end

我现在无法尝试,但我想这对你有所帮助:)。