加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何使用补丁RequestId中间件或为什么Heroku不使用标准

发布时间:2020-12-17 02:34:12 所属栏目:百科 来源:网络整理
导读:Heroku从其路由器推出了 new labs feature for tracking http-request-id. 一个小小的背景为什么它有用:Rails 3.2推出了TaggedLogger到include a unique request ID into the logs的功能,以便您可以跟踪给定日志行所属的Web请求.当运行多个将其日志流式传输
Heroku从其路由器推出了 new labs feature for tracking http-request-id.

一个小小的背景为什么它有用:Rails 3.2推出了TaggedLogger到include a unique request ID into the logs的功能,以便您可以跟踪给定日志行所属的Web请求.当运行多个将其日志流式传输到同一日志存储的Web服务器时,这非常重要,例如,在Heroku或Unicorn设置等多个dynos中很常见.

现在,通过Heroku的实验室功能,Heroku路由器将生成此请求ID,以便您可以在进入应用程序之前跟踪来自路由器级别的请求.这很重要,例如如果请求由于超时等原因未能完成

不幸的是,Heroku没有为此选择标准请求标头密钥,即Rails可以接受并通过的HTTP_X_REQUEST_ID,而是组成一个自定义的HTTP_HEROKU_REQUEST_ID,Rails将不经过修改而无法通过. Heroku,为什么这次偏离惯例呢?

所以,我有两个选择:将Rails默认的RequestId中间件替换为副本&使用Heroku的标题密钥粘贴作业,或者修补Rails中间件.我不喜欢copy&粘贴工作,因为他们不干燥,很容易变得陈旧,留下猴子补丁是更好的选择.但是怎么样呢?

我尝试添加一个文件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

但这并没有得到执行.我怎么修补这个?

解决方法

有一个解决方案!
我刚刚将它添加到我的production.rb中,它的工作原理!

config.log_tags = [lambda {|req| req.env['HTTP_HEROKU_REQUEST_ID']}]

积分到https://stackoverflow.com/a/10712252/2422778和Railscasts

编辑
只是想指出,截至2014年1月17日,Heroku修复了请求ID标题名称,现在就是

env['HTTP_X_REQUEST_ID']

见:https://devcenter.heroku.com/articles/http-request-id

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读