[英]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.