【问题标题】:How can I intercept ActiveRecord::Base.logger output?如何拦截 ActiveRecord::Base.logger 输出?
【发布时间】:2014-12-03 16:39:44
【问题描述】:

上下文: 我正在构建一个非常长的 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 行不包含流

【问题讨论】:

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


    【解决方案1】:

    ActiveRecord 异常和普通异常一样,你可以处理,所以请尝试:

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

    我现在无法尝试,但我想它可能对你有帮助:)

    【讨论】:

    • 感谢@Jan 的回答。实际上,我的代码已经在 begin-rescue 块中了。异常不是问题,问题是异常被记录到控制台。由于我正在捕获它并进行自己的错误处理,因此我不需要记录它并且它使我的日志变得混乱。
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多