gpt4 book ai didi

logging - Sinatra with Puma 在终端中提供两倍的输出

转载 作者:行者123 更新时间:2023-12-04 05:21:56 25 4
gpt4 key购买 nike

我已将 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如果你想玩

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

最佳答案

这是由 CommonLogger middleware 引起的.它是由 Rack (when using rackup ) 添加的来自 Sinatra (when logging is enabled) ,导致重复输出。 Sinatra 实际上使用了一个 custom subclass of this middleware尝试解决这个问题。为了让它工作,它修补了原来的 CommonLogger类(class)。

出现这个问题是因为 Puma 也defines its own version of CommonLogger 其中不包括 Sinatra 引入的更改。在 Sinatra 之后加载 Puma 时,Puma 版本会覆盖修补版本,因此会发生原始行为(重复的输出行)。

有几种方法可以解决此问题。您可以在 Sinatra 中禁用日志记录以防止添加重复的中间件。 Sinatra 日志记录设置适用于 CommonLogger Logger 中间件(这是 logger helper 使用的),因此您可能需要添加 Logger自己的中间件:

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

关于logging - Sinatra with Puma 在终端中提供两倍的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31206060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com