ruby-on-rails 如何在Rails中查看整个HTTP请求

uplii1fm  于 2023-05-30  发布在  Ruby
关注(0)|答案(5)|浏览(134)

我有一个Rails应用程序,但经过一段时间的开发/调试,我意识到能够在日志文件-log/development. log中看到整个HTTP请求将非常有帮助,而不仅仅是参数。
我还希望有一个单独的日志文件的基础上,用户,而不是会话。
任何想法将不胜感激!

zqdjd7g9

zqdjd7g91#

您可以通过以下方式在视图中快速查看request.env:

*VIEW:<%= request.env.inspect %>

如果您想将其记录在开发日志中,请从您的控制器:

*控制器:Rails.logger.info(request.env)

在这里,您可以看到Request对象的reference
Rails使用Ruby标准库中的Logger自动将日志记录设置为log/目录中的文件。日志文件将根据您的环境命名,例如log/development.log。
要记录来自控制器或模型的消息,请使用logger方法访问Rails logger示例:

class YourController < ActionController::Base
  def index
    logger.info request.env
  end
end

关于用户,您使用什么对其进行身份验证?

8wigbo56

8wigbo562#

logger.info request.env代码在Rails控制器中工作正常,但要查看更原始的版本,或者如果您使用Grape或其他安装的应用程序,您必须在通过机架中间件链的过程中拦截请求。
将以下代码放在lib目录中(或application.rb的底部):

require 'pp'
class Loggo
  def initialize(app)
    @app = app
  end
  def call(env)
    pp env
    @app.call(env)
  end
end

然后在application.rb中的其他config s中:

config.middleware.use "Loggo"
sqserrrh

sqserrrh3#

您可以使用rack中间件记录中间件看到的请求(由http服务器解析并由前面的中间件转换)。如果你的http服务器支持这样的功能,你也可以配置你的http服务器来记录完整的请求。
http服务器(web服务器)负责接收http请求,解析它们,并将数据结构发送到应用服务器(例如,机架应用)。应用服务器看不到原始请求,但看到http服务器发送的内容。

46qrfjad

46qrfjad4#

我最初使用的是@AlexChaffee的代码片段,但后来我改用了mitmproxy,这是一个专门的HTTP代理,可以记录通过它的请求和响应。
这显然只对控制发出请求的应用程序的开发场景有帮助。对于生产应用程序,您也许可以使用反向代理来实现类似的结果(优点是您不必为此接触Rails应用程序本身),但我还没有对此进行研究。

slhcrj9b

slhcrj9b5#

只是跟进AlexChaffee的精彩回答。
我们的中间件Loggo需要放在application.rb中**module YourApp之前。
如前所述,添加config.middleware.use "Loggo"
env就是Hash,所以我们可以得到env.keys
例如,输出一个整洁的必要标题:

class Loggo
  def initialize(app)
    @app = app
  end
    
  def call(env)
    heds = %w(
      QUERY_STRING SERVER_PROTOCOL REQUEST_URI GATEWAY_INTERFACE
      HTTP_ORIGIN HTTP_HOST HTTP_X_FORWARDED_FOR REMOTE_ADDR
    )
        
    heds.each do |hed|
      puts "#{hed.ljust(30)} => #{env[hed]}"
    end
    
    @app.call(env)
  end
end

并使用STDOUT手动运行轨道:RAILS_LOG_TO_STDOUT=true RAILS_ENV=production bundle exec rails s
到达终点站:

QUERY_STRING                   => 
SERVER_PROTOCOL                => HTTP/1.1
REQUEST_URI                    => /cable
GATEWAY_INTERFACE              => CGI/1.2
HTTP_ORIGIN                    => http://example.com
HTTP_HOST                      => example.com
HTTP_X_FORWARDED_FOR           => X.X.X.X
REMOTE_ADDR                    => 127.0.0.1

相关问题