在Sinatra中使用Rack :: CommonLogger

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)

希望这可以帮助.

  • MyLoggerMiddleware#call(env)的第一行不应该是:env ['rack.errors'] = @logger? (4认同)
  • 这对我不起作用。它对 Sinatra 或 Rack 日志没有影响。 (2认同)

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)