我尝试在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对象中的日志记录设备是空的。
任何想法,或其他方式来实现这一目标?
谢谢,
答案 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
)
如果您希望日志转到同一个地方,您可能需要检查您的服务器,它可能会记录到标准错误