调用另一条路线时 Sinatra 未记录
Sinatra is not logging when calling another route
我正在尝试每 5 秒触发一次路由,在 Sinatra 应用程序中使用 Rufus Scheduler;使用此处提供的解决方案 (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 对象中的记录设备是空的。
有什么想法或其他方法可以实现吗?
谢谢,
当 Sinatra 为请求设置日志记录时,它 uses the IO object in env['rack.errors']
(Sinatra 使用 Rack::Logger
的子类)作为消息的目的地。这是由服务器在将请求移交给您的应用程序之前处理请求时设置的。
当您直接使用 call
时,您会绕过服务器进行设置的工作,因此 env['rack.errors']
保持未设置状态,因此它计算 t nil
。这最终会创建一个简单地忽略任何请求的记录器。
您可以通过在 rack.errors
键下将 IO 对象添加到您传递给 call
的散列中来实现此目的。例如登录到标准输出:
call(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/test',
'rack.input' => StringIO.new,
'rack.errors' => $stdout
)
如果您希望日志转到同一个地方,您可能需要检查您的服务器,它可能正在记录标准错误
我正在尝试每 5 秒触发一次路由,在 Sinatra 应用程序中使用 Rufus Scheduler;使用此处提供的解决方案 (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 对象中的记录设备是空的。
有什么想法或其他方法可以实现吗?
谢谢,
当 Sinatra 为请求设置日志记录时,它 uses the IO object in env['rack.errors']
(Sinatra 使用 Rack::Logger
的子类)作为消息的目的地。这是由服务器在将请求移交给您的应用程序之前处理请求时设置的。
当您直接使用 call
时,您会绕过服务器进行设置的工作,因此 env['rack.errors']
保持未设置状态,因此它计算 t nil
。这最终会创建一个简单地忽略任何请求的记录器。
您可以通过在 rack.errors
键下将 IO 对象添加到您传递给 call
的散列中来实现此目的。例如登录到标准输出:
call(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/test',
'rack.input' => StringIO.new,
'rack.errors' => $stdout
)
如果您希望日志转到同一个地方,您可能需要检查您的服务器,它可能正在记录标准错误