【问题标题】:How do I get SInatra and Rack to output to my Logger instance?如何让 Sinatra 和 Rack 输出到我的 Logger 实例?
【发布时间】:2016-06-16 18:04:01
【问题描述】:

我有一个 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
  • 接受的答案似乎极其复杂,并且在 cmets 中提出了许多未回答的问题。 (我真的需要在 config.ru 中设置一个记录器并添加一个中间件日志记录层吗?日志记录层的语法是否像 >=4 人认为的那样错误?)

根据 Sinatra 的说法,我应该能够从其 settings 块控制 Rack。这不是真的吗?

更新 2:我现在已经对另一个问题的解决方案进行了适当的尝试。按原样实现它......这里的日志绝对没有。

【问题讨论】:

标签: ruby logging sinatra rack


【解决方案1】:

我没有使用 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 得到的只是来自 Rack 记录器的预格式化字符串。我无法重新格式化它以使其与我的其他日志消息相同。但这是我得到的最接近答案的答案。非常感谢。打勾。
【解决方案2】:

我还不能发表评论,所以发布答案。您可以格式化发送到 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

【讨论】:

  • 好吧,如果我将一个现有的、已经格式化的记录器实例传递给它,我不应该这样做。但是,我会把它添加到要尝试的事情列表中,谢谢。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多