Синатра с Пумой выдает вдвое больше в терминале
Я добавил 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