调用另一条路线时,Sinatra没有记录

时间:2015-01-16 18:29:31

标签: ruby sinatra rufus-scheduler

我尝试在Sinatra应用程序中使用Rufus Scheduler每隔5秒触发一次路由;使用此处提供的解决方案(Calling Sinatra from within 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

当通过call()方法调用时:

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

似乎Logger对象中的日志记录设备是空的。

任何想法,或其他方式来实现这一目标?

谢谢,

1 个答案:

答案 0 :(得分:2)

当Sinatra为请求设置日志记录时,它uses the IO object in env['rack.errors'](Sinatra使用Rack::Logger的子类)作为消息的目标。这是由服务器在将请求移交给您的应用程序之前处理请求而设置的。

当您直接使用call时,您会绕过服务器进行设置的工作,因此env['rack.errors']仍未设置,因此会评估t nil。这最终会创建一个只忽略任何请求的记录器。

您可以通过在call密钥下传递给rack.errors的哈希值添加IO对象来实现此功能。例如,要登录标准输出:

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

如果您希望日志转到同一个地方,您可能需要检查您的服务器,它可能会记录到标准错误