簡體   English   中英

如何使SInatra和Rack輸出到Logger實例?

[英]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實例,而不是他們自己的實例。

  • 我如何讓Sinatra使用記錄儀?
  • 如何讓Rack使用記錄儀?

(或者,我可以將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日志記錄,僅涉及Rack
  • 可接受的答案似乎非常復雜,並且在注釋中提出了許多未解決的問題。 (我是否真的需要在config.ru中設置記錄器並添加中間件日志記錄層?日志記錄層的語法是否錯誤,因為> = 4的人似乎在思考?)

根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM