Law*_*den 26 ruby logging rack error-logging sinatra
我有一个与Sinatra一起编写的小型Web服务器.我希望能够将消息记录到日志文件中.我通过http://www.sinatrarb.com/api/index.html和www.sinatrarb.com/intro.html 阅读,我看到Rack有一个名为Rack :: CommonLogger的东西,但我找不到如何访问和用于记录消息的任何示例.我的应用程序很简单所以我把它写成顶级DSL,但我可以切换到从SinatraBase继承它,如果这是所需要的一部分.
Rom*_*lez 41
Rack::CommonLogger
不会为你的主应用程序提供一个记录器,它只会像Apache那样记录请求.
自己检查代码:https://github.com/rack/rack/blob/master/lib/rack/common_logger.rb
所有Rack
应用程序都具有使用HTTP Request env调用的调用方法,如果您检查此中间件的调用方法,则会发生以下情况:
def call(env)
began_at = Time.now
status, header, body = @app.call(env)
header = Utils::HeaderHash.new(header)
log(env, status, header, began_at)
[status, header, body]
end
Run Code Online (Sandbox Code Playgroud)
在@app
这种情况下是主要的应用程序,中间件是刚刚注册的请求开始的时候,那么它的类中间件获得[状态,头部,身躯]三联,然后调用这些参数专用日志方法,返回你的应用程序首先返回的三倍.
该logger
方法是这样:
def log(env, status, header, began_at)
now = Time.now
length = extract_content_length(header)
logger = @logger || env['rack.errors']
logger.write FORMAT % [
env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
env["REMOTE_USER"] || "-",
now.strftime("%d/%b/%Y %H:%M:%S"),
env["REQUEST_METHOD"],
env["PATH_INFO"],
env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
env["HTTP_VERSION"],
status.to_s[0..3],
length,
now - began_at ]
end
Run Code Online (Sandbox Code Playgroud)
正如您所知,该log
方法只是从请求env中获取一些信息,并登录构造函数调用中指定的记录器,如果没有记录器实例,则它会转到rack.errors
记录器(默认情况下似乎有一个) )
使用它的方式(在你的config.ru
):
logger = Logger.new('log/app.log')
use Rack::CommonLogger, logger
run YourApp
Run Code Online (Sandbox Code Playgroud)
如果您想在所有应用中都有一个通用记录器,您可以创建一个简单的记录器中间件:
class MyLoggerMiddleware
def initialize(app, logger)
@app, @logger = app, logger
end
def call(env)
env['mylogger'] = @logger
@app.call(env)
end
end
Run Code Online (Sandbox Code Playgroud)
要使用它,请在config.ru
:
logger = Logger.new('log/app.log')
use Rack::CommonLogger, logger
use MyLoggerMiddleware, logger
run MyApp
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
Phr*_*ogz 15
在你的config.ru
:
root = ::File.dirname(__FILE__)
logfile = ::File.join(root,'logs','requests.log')
require 'logger'
class ::Logger; alias_method :write, :<<; end
logger = ::Logger.new(logfile,'weekly')
use Rack::CommonLogger, logger
require ::File.join(root,'myapp')
run MySinatraApp.new # Subclassed from Sinatra::Application
Run Code Online (Sandbox Code Playgroud)