Heroku 推出了一项新的实验室功能,用于从其路由器跟踪 http-request-id 。
一个有用的背景知识:Rails 3.2 推出了一个带有 TaggedLogger 的功能,可以在日志中包含一个唯一的请求 ID,以便您可以跟踪给定日志行属于哪个 Web 请求。这在运行多个将日志流式传输到同一个日志存储的 Web 服务器时非常重要,例如在 Heroku 或 Unicorn 设置上的多个 dyno 中很常见,等等。
现在,借助 Heroku 的实验室功能,Heroku 路由器将生成此请求 ID,以便您可以在请求进入应用程序之前从路由器级别跟踪请求。这很重要,例如,如果请求未能完成,由于超时等。
不幸的是,Heroku 没有为此选择标准的请求标头键,HTTP_X_REQUEST_ID
Rails 会接受并通过它,而是制作了一个自定义的键HTTP_HEROKU_REQUEST_ID
,Rails 不会在没有修改的情况下通过。Heroku,为什么这里偏离惯例?
所以,我有两个选择:要么用RequestId
使用 Heroku 标题键的复制和粘贴作业替换 Rails 默认中间件,要么修改 Rails 中间件。我不喜欢复制和粘贴工作,因为它们不干燥并且很容易过时,因此猴子补丁是更好的选择。怎么办呢?
我尝试添加一个文件config/initializers/middleware.rb
:
module ActionDispatch
class RequestId
private
def external_request_id(env)
if request_id = env["HTTP_X_REQUEST_ID"].presence || env['HTTP_HEROKU_REQUEST_ID'].presence
request_id.gsub(/[^\w\-]/, "").first(255)
end
end
end
end
但这不会被执行。我该如何修补这个?