机架中间件中的跟踪错误

时间:2015-12-05 10:41:30

标签: ruby-on-rails ruby rack

此时我不是100%肯定,但我相信我得到的异常会导致请求的状态以401响应。

我已经删除了控制器中的所有代码,问题仍然存在,并且似乎正在捕获异常,以便返回401状态,因此没有堆栈跟踪。

我已经创建了一个自定义中间件来尝试和调试,但我仍然无法找到问题的根源。

如何找出问题发生的位置?

我们正在使用heroku,所以pry似乎不起作用,也没有命令行访问正在运行的服务器。我无法在我的本地开发机器上复制该问题。

2 个答案:

答案 0 :(得分:1)

我从未发现如何注入日志记录,但是一些hacky解决方法是创建一个额外的中间件,它可以在你想要的地方执行日志记录。

class Debugger
  def initialize(app, *args)
    @app = app
    @args = args
  end

  def call(env)
    Rails.logger.debug "executing app.call Debugger #{@args.first}"
    status, headers, body = @app.call(env)

    Rails.logger.debug "Status: #{status} after app.call Debugger #{@args.first}"
    [status, headers, body]
  end
end

然后在中间件堆栈中添加记录器,在Rails中这将进入config/application.rb

config.middleware.insert_before Rack::Sendfile, "Debugger", "1"

会导致Rails记录器添加

Executing app.call Debugger 1

然后执行Rack:Sendfile和日志:

Status: 400 after app.call Debugger 1

假设您正在使用rails,并且Rack :: Sendfile返回的状态代码返回了400状态代码。

注意,如果您不使用Rails,则需要修改记录器,以及如何配置中间件。

这不是一个理想的解决方案,可能有更好的方法,但在撰写本文时我没有更好的方法。

答案 1 :(得分:0)

一个替代方法是以下模块,该模块在每个中间件输入/返回处插入调试消息(每次返回后均打印状态代码) (改编自https://github.com/DataDog/dd-trace-rb/issues/368

@font-face {
  font-family: 'SpecialElite-Regular';
  src:  url( $font-path + '/SpecialElite-Regular/SpecialElite-Regular.ttf') format('ttf'), 
        url( $font-path + '/SpecialElite-Regular/SpecialElite-Regular.eot') format('eot'),
        url( $font-path + '/SpecialElite-Regular/SpecialElite-Regular.svg') format('svg'),
        url( $font-path + '/SpecialElite-Regular/SpecialElite-Regular.woff') format('woff'),
        url( $font-path + '/SpecialElite-Regular/SpecialElite-Regular.woff2') format('woff2');
}