带有Puma的Sinatra在终端

时间:2015-07-03 11:45:21

标签: logging sinatra puma rackup

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

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

的Gemfile

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

gem 'sinatra'
gem 'puma'

config.ru

require 'sinatra'

get '/' do
  'Hello World'
end

run Sinatra::Application

这是我运行的命令:

rackup -s puma

这是我浏览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

我已经上传example project to github如果您想要播放

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

1 个答案:

答案 0 :(得分:8)

这是由CommonLogger middleware引起的。它由Rack (when using rackup)Sinatra (when logging is enabled)添加,从而产生重复的输出。 Sinatra实际上使用custom subclass of this middleware来尝试解决此问题。为了使它能够工作,它会修补原始的CommonLogger类。

问题出现了,因为Puma也defines its own version of CommonLogger不包括Sinatra引入的变化。当在Sinatra之后加载Puma时,Puma版本会覆盖修补版本,因此会出现原始行为(重复的输出行)。

有几种方法可以解决此问题。您可以禁用Sinatra中的日志记录以防止添加重复的中间件。 Sinatra日志记录设置适用于CommonLoggerLogger中间件(logger helper使用的),因此您可能希望自己添加Logger中间件:< / p>

disable :logging
use Rack::Logger

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

$ rackup -q -s puma

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

$ rackup -s puma -r puma