[英]How do I get the Sinatra app instance that's being tested by rack-test?
[英]How do I get SInatra and Rack to output to my Logger instance?
我有一個Sinatra應用程序,它通過Logger實例將穩定的信息流輸出到STDOUT。 我還打開了Sinatra日志記錄和Rack日志記錄。 為了論證,可以說這是一個好主意。
這是當前輸出的樣子:
[2016-03-03 11:32:38] INFO WEBrick 1.3.1
[2016-03-03 11:32:38] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-03-03 11:32:38] INFO WEBrick::HTTPServer#start: pid=12303 port=4567
[03/03/16 11:32:45] core/lib/registry.rb INFO Resolving request for u:/swingshift/registry a:GET
[03/03/16 11:32:45] core/lib/registry.rb INFO SwingShift::RegistryController has been selected...
10.192.0.136 - - [03/Mar/2016:11:32:45 +0000] "GET /swingshift/registry HTTP/1.1" 200 10227 0.0557
10.192.0.136 - - [03/Mar/2016:11:32:46 +0000] "GET /css/bootstrap.min.css HTTP/1.1" 304 - 0.0023
如您所見,有點混亂。 我想告訴Sinatra和Rack使用我的Logger實例,而不是他們自己的實例。
(或者,我可以將proc傳遞給他們的記錄器以對它們進行格式化嗎?雖然不盡如人意,但是會有所幫助。)
這是我的Sinatra設置塊。 至此,$ logger已經指向我的Logger實例:
configure do
$logger.info(__FILE__){"Starting..."}
set :bind, '0.0.0.0'
enable :sessions
set :session_secret, 'whatever'
set :views, BASEDIR
set :haml, :layout_options => { :views => 'core/views' }
enable :logging
set :dump_errors, true
end
我也有一個
use Rack::CommonLogger, $logger
...但是它似乎無能為力。
更新::我知道https://stackoverflow.com/questions/2239240A/use-rackcommonlogger-in-sinatra ,但是:
根據Sinatra的說法,我應該能夠從其settings
模塊控制Rack。 這不是真的嗎
更新2:我現在可以適當解決其他問題了。 照原樣實施它……這里的日志絕對沒有。
我沒有使用WEBrick,而是使用Thin( set :server, 'thin'
),無論如何根據Sinatra的配置,我將rack.errors
重定向到$logger
:
class IOToLog < IO
def initialize(logger)
@logger = logger
end
def write(string)
@logger.debug {"SINATRA #{string.strip}"}
end
end
IOTOLOG = IOToLog.new($logger)
before {
env["rack.errors"] = IOTOLOG
}
輸出是:
2017-06-21 15:44:46.166 DEBUG SINATRA 127.0.0.1 - - [21/Jun/2017:15:44:46 +0200] "GET /wd/hub/status HTTP/1.1" 200 83 0.0004
2017-06-21 15:44:51.167 DEBUG SINATRA 127.0.0.1 - - [21/Jun/2017:15:44:51 +0200] "GET /wd/hub/status HTTP/1.1" 200 83 0.0004
順便說一句,我已經嘗試過env["rack.logger"] = $logger
但是沒有運氣。
我還不能發表評論,所以發布答案。 您可以格式化進入IOToLog的消息。 您需要在before塊中設置格式。 也許是這樣的
before {
env["rack.errors"] = IOTOLOG
IOTOLOG.format
}
並在IOToLog中添加如下內容:
class IOToLog < IO
def format
@logger.formatter = proc do |severity, datetime, progname, msg|
"#{severity}: #{msg}\n"
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.