4

Heroku 推出了一项新的实验室功能,用于从其路由器跟踪 http-request-id 。

一个有用的背景知识:Rails 3.2 推出了一个带有 TaggedLogger 的功能,可以在日志中包含一个唯一的请求 ID,以便您可以跟踪给定日志行属于哪个 Web 请求。这在运行多个将日志流式传输到同一个日志存储的 Web 服务器时非常重要,例如在 Heroku 或 Unicorn 设置上的多个 dyno 中很常见,等等。

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

不幸的是,Heroku 没有为此选择标准的请求标头键,HTTP_X_REQUEST_IDRails 会接受并通过它,而是制作了一个自定义的键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

但这不会被执行。我该如何修补这个?

4

1 回答 1

4

有一个解决方案!我刚刚将它添加到我的 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

于 2013-06-20T21:32:44.607 回答