2015-01-16 3 views
0

Я пытаюсь запустить маршрут каждые 5 секунд, используя Rufus Scheduler в приложении Sinatra; с предлагаемым здесь решением (Calling Sinatra from within Sinatra).Sinatra не регистрируется при вызове другого маршрута

Все работает нормально, за исключением того, что Logger ничего не записывает, когда маршрут вызывается планировщиком.

require 'sinatra/base' 
require 'rufus/scheduler' 

class App < Sinatra::Base 
    configure do 
     enable :logging 
    end 

    Rufus::Scheduler.new.every("5s") do 
     call(
      'REQUEST_METHOD' => 'GET', 
      'PATH_INFO' => '/test', 
      'rack.input' => StringIO.new, 
     ) 
    end 

    get '/test' do 
     puts env["rack.logger"].inspect 
     logger.info "This is a logger test." 
    end 
    run! 
end 

Вот результат при вызове Curl без планировщика:

#<Logger:0x0000000249a9d8 @progname=nil, @level=1, @default_formatter=#<Logger::Formatter:0x0000000249a9b0 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x0000000249a8c0 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDERR>>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0x0000000249a870 @mon_owner=nil, @mon_count=0, @mon_mutex=#<Mutex:0x0000000249a7d0>>>> 
I, [2015-01-15T20:49:36.365062 #15803] INFO -- : This is a logger test. 
127.0.0.1 - - [15/Jan/2015 20:49:36] "GET /test HTTP/1.1" 200 - 0.0011 

И при вызове метода вызова():

#<Logger:0x000000024b8a78 @progname=nil, @level=1, @default_formatter=#<Logger::Formatter:0x000000024b89b0 @datetime_format=nil>, @formatter=nil, @logdev=nil> 

Is кажется, что записывающее устройство в объект Logger пуст.

Любые идеи или другие способы достижения этого?

Спасибо,

+0

Что происходит, когда вы положили планировщик из картины? Тот же выход журнала? – jmettraux

+0

Все в порядке без планировщика. –

ответ

2

Когда Sinatra устанавливает вход для запроса, он uses the IO object in env['rack.errors'] (Sinatra использует подкласс Rack::Logger) в качестве адресата сообщения. Это задается сервером, когда он обрабатывает запрос, прежде чем передать его вашему приложению.

Когда вы используете call, вы можете обойти работу, которую сервер делает, поэтому env['rack.errors'] не работает, поэтому он оценивает t nil. Это приводит к созданию регистратора, который просто игнорирует любые запросы.

Вы можете получить эту работу, добавив объект IO к хэшу, который вы передаете в call под ключом rack.errors. Например, чтобы войти в стандартный вывод:

call(
    'REQUEST_METHOD' => 'GET', 
    'PATH_INFO' => '/test', 
    'rack.input' => StringIO.new, 
    'rack.errors' => $stdout 
) 

Вам может понадобиться, чтобы проверить сервер, если вы хотите, журналы, идущие в том же месте, это может быть вход в стандартной ошибки

+0

Спасибо! Он отлично работает с 'rack.errors' => $ stderr –

Смежные вопросы