【问题标题】:Sinatra with Puma gives twice the output in the terminal带有 Puma 的 Sinatra 在终端中提供两倍的输出
【发布时间】:2015-09-21 06:01:54
【问题描述】:

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

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

宝石文件

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

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

【问题讨论】:

    标签: logging sinatra puma rackup


    【解决方案1】:

    这是由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 中间件:

    disable :logging
    use Rack::Logger
    

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

    $ rackup -q -s puma
    

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

    $ rackup -s puma -r puma
    

    【讨论】:

    • 哇,这真是一个令人难以置信的答案。很好的解释,非常有帮助!非常感谢!!
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2013-12-02
    • 2017-11-03
    相关资源
    最近更新 更多