【问题标题】:Rails: Finding a bug that occurs in a Resque worker. No logs to RollbarRails:查找发生在 Resque 工作程序中的错误。没有日志到 Rollbar
【发布时间】:2015-10-23 07:34:32
【问题描述】:

我使用 Rails 和 Rollbar 来跟踪错误并使用 Resque 来处理延迟的任务。我的一名工人在 resque GUI 中因以下错误而失败:

Net::ReadTimeout
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:158:in `rescue in rbuf_fill'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:152:in `rbuf_fill'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:134:in `readuntil'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:144:in `readline'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http/response.rb:39:in `read_status_line'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http/response.rb:28:in `read_new'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1412:in `block in transport_request'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1409:in `catch'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1409:in `transport_request'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1382:in `request'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1283:in `request_get'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:479:in `block in get_response'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:852:in `start'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:582:in `start'
/app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:477:in `get_response'
/app/app/services/get_json.rb:4:in `call'
/app/app/models/imdb.rb:9:in `data'
/app/app/models/customer.rb:92:in `imdb_data'
/app/app/models/customer.rb:60:in `get_external_data'
/app/app/models/customer.rb:13:in `scan'
/app/app/models/shop.rb:110:in `block in bulk_scan'
/app/app/models/shop.rb:101:in `each'
/app/app/models/shop.rb:101:in `bulk_scan'
/app/app/workers/bulk_scanner.rb:9:in `perform'

但是,查看有关失败的更多可靠信息会非常有帮助。例如。参数是什么。通常我将 Rollbar 用于此类事情,但由于某种原因它似乎没有记录此错误。

我将如何修复这个错误?因为我真的不知道是什么触发了它? (我的工作人员基本上是在循环使用不同用户的一大堆 API 调用,我不知道哪个失败了)

【问题讨论】:

  • 嘿杰克逊,这是在我们之前谈话之前还是之后?我很乐意为您解决这个问题。

标签: ruby-on-rails resque


【解决方案1】:

您可以创建自定义记录器,并使用它来记录有用的信息以跟踪您的问题。在您的工作人员中,添加转储变量内容等的调试语句。

my_log = Logger.new("log/worker.log")

def do_stuff
  my_log.info "#do_stuff"
end

另一种选择是在代码中放置断点。你会得到一个交互式的 shell,你可以用它来摆弄。

debugger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2012-04-24
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多