如何让 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 使用我的记录器?
(或者,我可以将过程传递给 他们的 记录器以将它们格式化为相同的格式吗?那不是很好,但它会是一些东西。)
这是我的 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
...不过好像没什么作用。
更新:: 我知道 ,但是:
- 它不解决 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 {
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
我有一个 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 使用我的记录器?
(或者,我可以将过程传递给 他们的 记录器以将它们格式化为相同的格式吗?那不是很好,但它会是一些东西。)
这是我的 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
...不过好像没什么作用。
更新:: 我知道 ,但是:
- 它不解决 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 {
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