簡體   English   中英

機架中間件中的跟蹤錯誤

[英]Trace Error in Rack Middleware

我此時並不是100%肯定,但我相信我得到的異常導致請求的狀態以401響應。

我已經刪除了控制器中的所有代碼,問題仍然存在,並且似乎正在捕獲異常,以便返回401狀態,因此沒有堆棧跟蹤。

我已經創建了一個自定義中間件來嘗試和調試,但我仍然無法找到問題的根源。

如何找出問題所在?

我們正在使用heroku,所以pry似乎不起作用,也沒有命令行訪問正在運行的服務器。 我無法在我的本地開發機器上復制該問題。

我從來沒有發現如何注入日志記錄,但是一些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中將logger添加到中間件堆棧中,這將放在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,則需要修改記錄器以及如何配置要運行的中間件。

這不是一個理想的解決方案,可能有更好的方法,但在撰寫本文時我沒有更好的解決方案。

另一種方法是下面的模塊,它在每個中間件入口/返回處插入一個調試消息(每次返回后打印狀態代碼)(改編自https://github.com/DataDog/dd-trace-rb/issues/368

# Trace each middleware module entry/exit. Freely adapted from
# https://github.com/DataDog/dd-trace-rb/issues/368 "Trace each middleware in the Rails stack"
module MiddlewareTracer
  def call(env)
    Rails.logger.debug { "MiddleWare: entry #{self.class.name}" }
    status, headers, response = super(env)
    Rails.logger.debug { "MiddleWare: #{self.class.name}, returning with status #{status}" }
    [status, headers, response]
  end
end

# Instrument the middleware stack after initialization so that we
# know the stack won't be changed afterwards.
Rails.configuration.after_initialize do
  Rails.application.middleware.each do |middleware|
    klass = middleware.klass

    # There are a few odd middlewares that aren't classes.
    klass.prepend(MiddlewareTracer) if klass.respond_to?(:prepend)
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM