带有Puma的Sinatra在终端中输出两倍的输出

Lou*_*ers 3 logging sinatra rackup puma

我已将Puma添加到我的sinatra应用程序中,现在我在终端中获得两行输出请求.我已经检查过它实际上并没有两次调用代码,我猜测也许Puma正在输出请求信息以及Sinatra.

作为演示,我创建了一个简单的应用程序如下:

的Gemfile

source 'https://rubygems.org'
ruby '2.2.0'

gem 'sinatra'
gem 'puma'
Run Code Online (Sandbox Code Playgroud)

config.ru

require 'sinatra'

get '/' do
  'Hello World'
end

run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)

这是我运行的命令:

rackup -s puma
Run Code Online (Sandbox Code Playgroud)

这是我浏览http:// localhost:9292 /时收到的输出类型

R5001755:test louis.sayers$ rackup -s puma
Puma 2.11.3 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:9292
::1 - - [03/Jul/2015:21:46:37 +1000] "GET / HTTP/1.1" 200 11 0.0074
::1 - - [03/Jul/2015:21:46:37 +1000] "GET / HTTP/1.1" 200 11 0.0222
Run Code Online (Sandbox Code Playgroud)

如果你想玩一个游戏,我已经将示例项目上传到了github

关于发生了什么的任何想法?谢谢你的帮助!

mat*_*att 8

这是由CommonLogger中间件引起的.它由Rack(使用时rackup)Sinatra(启用日志记录时)添加,从而产生重复输出.Sinatra实际上使用此中间件自定义子类来尝试解决此问题.为了使它工作,它修补原始CommonLogger类.

问题出现是因为Puma还定义了自己的版本,CommonLogger其中不包括Sinatra引入的更改.当在Sinatra之后加载Puma时,Puma版本会覆盖修补版本,因此会发生原始行为(重复的输出行).

有几种方法可以解决此问题.您可以禁用Sinatra中的日志记录以防止添加重复的中间件.该西纳特拉日志记录设置既适用于CommonLoggerLogger中间件(这是什么logger帮手使用),所以你可能要添加Logger自己的中间件:

disable :logging
use Rack::Logger
Run Code Online (Sandbox Code Playgroud)

您还可以通过使用命令选项来阻止rackup添加CommonLogger中间件:-qrackup

$ rackup -q -s puma
Run Code Online (Sandbox Code Playgroud)

另一种选择是确保在Sinatra之前加载Puma,这样当Sinatra补丁时,CommonLogger它正在修补Puma版本,补丁不会在以后被覆盖.您可以使用-r选项rackup强制它加载Puma 来执行此操作:

$ rackup -s puma -r puma
Run Code Online (Sandbox Code Playgroud)