Синатра с Пумой выдает вдвое больше в терминале

Я добавил Puma в мое приложение sinatra, и теперь я получаю две строки вывода для запросов в терминале. Я проверил, и он на самом деле не вызывает код дважды, и я предполагаю, что, возможно, Puma выводит информацию о запросе вместе с Синатрой.

В качестве демонстрации я создал простое приложение следующим образом:

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

Я загрузил пример проекта на github, если вы хотите поиграть

Есть идеи о том, что происходит? Спасибо за вашу помощь!

1 ответ

Решение

Это вызвано CommonLogger промежуточное ПО. Добавляется обе стойки (при использованииrackup ) и Sinatra (когда ведение журнала включено), что приводит к дублированию вывода. Синатра фактически использует собственный подкласс этого промежуточного программного обеспечения, чтобы попытаться решить эту проблему. Для того, чтобы он работал, он исправляет оригиналCommonLoggerучебный класс.

Проблема возникает потому, что Puma также определяет свою собственную версиюCommonLoggerкоторый не включает в себя изменения, внесенные Синатрой. Когда Puma загружается после Sinatra, версия Puma перезаписывает пропатченную версию, и поэтому возникает оригинальное поведение (дублированные строки вывода).

Есть несколько способов обойти эту проблему. Вы можете отключить вход в Sinatra, чтобы предотвратить добавление дублирующего промежуточного программного обеспечения. Параметр регистрации Sinatra применяется как кCommonLoggerиLogger промежуточное программное обеспечение (что является logger помощник), так что вы можете добавить Logger промежуточное ПО самостоятельно:

disable :logging
use Rack::Logger

Вы также можете предотвратить rackup от добавления CommonLogger промежуточное программное обеспечение с помощью -q вариант к rackup команда:

$ rackup -q -s puma

Другим вариантом было бы убедиться, что Puma загружается до Sinatra, чтобы при исправлении Sinatra CommonLogger это патч версии Puma, и патч не будет перезаписан позже. Вы можете сделать это с помощью -r возможность rackup заставить его загрузить Puma:

$ rackup -s puma -r puma
Другие вопросы по тегам