2016-03-03 66 views
1

我有一個Sinatra應用程序,它通過記錄器的一個實例向STDOUT輸出穩定的信息流。我還開啓了Sinatra日誌記錄和Rack登錄。爲了論證的緣故,讓我們說這是一個好主意。如何讓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的實例,而不是自己的實例。

  • 如何獲得Sinatra使用我的記錄器?
  • 如何讓Rack使用我的記錄器?

(或者,我可以通過一個進程來他們記錄器設置它們的格式一樣嗎?這不是那麼好,但它會是什麼。)

這裏是我的末日設置阻止。此時$記錄已經指向我的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,但:

  • 它不涉及西納特拉記錄,只是機架
  • 接受的答案似乎非常複雜,有許多懸而未決在評論中提出的觀點。 (我真的需要設置一個config.ru記錄,並添加一箇中間件層記錄?對於記錄層錯的語法,> = 4人似乎認爲?)

根據西納特拉我」 m應該能夠從settings塊中控制Rack。這是不是真的?

更新2:我現在已經有了解決其他問題的正確方法。按原樣執行它......對這裏的日誌完全沒有任何影響。

+0

[使用機架:: CommonLogger在西納特拉(可能的重複http://stackoverflow.com/questions/2239240/use- rackcommonlogger-in-sinatra) – Anthony

回答

0

我沒有使用反正根據西納特拉的配置我重定向rack.errors$logger的WEBrick但薄(set :server, 'thin'):

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 

BTW我已經嘗試env["rack.logger"] = $logger,但沒有運氣。

+0

不錯!不幸的是,IOToLog獲得的是來自Rack記錄器的預先格式化的字符串。我無法重新格式化它,使其與我的其他日誌消息相同。 但這是最接近我得到的答案。非常感謝。蜱。 –

0

我還不能發表評論發佈回答。您可以格式化消息到IOToLog。您需要在塊前設置格式。也許像

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 
+0

那麼,如果我將它傳遞給一個現有的已經格式化的記錄器實例,那麼我不應該那樣做。但是,我會將它添加到要嘗試的列表中,謝謝。 –