Class: Rack::CommonLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/commonlogger.rb

Overview

Rack::CommonLogger forwards every request to an app given, and logs a line in the Apache common log format to the logger, or rack.errors by default.

Instance Method Summary collapse

Constructor Details

#initialize(app, logger = nil) ⇒ CommonLogger

Returns a new instance of CommonLogger.



7
8
9
10
# File 'lib/rack/commonlogger.rb', line 7

def initialize(app, logger=nil)
  @app = app
  @logger = logger
end

Instance Method Details

#<<(str) ⇒ Object

By default, log to rack.errors.



25
26
27
28
# File 'lib/rack/commonlogger.rb', line 25

def <<(str)
  @env["rack.errors"].write(str)
  @env["rack.errors"].flush
end

#_call(env) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/rack/commonlogger.rb', line 16

def _call(env)
  @env = env
  @logger ||= self
  @time = Time.now
  @status, @header, @body = @app.call(env)
  [@status, @header, self]
end

#call(env) ⇒ Object



12
13
14
# File 'lib/rack/commonlogger.rb', line 12

def call(env)
  dup._call(env)
end

#eachObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/rack/commonlogger.rb', line 30

def each
  length = 0
  @body.each { |part|
    length += part.size
    yield part
  }

  @now = Time.now

  # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
  # lilith.local - - [07/Aug/2006 23:58:02] "GET / HTTP/1.1" 500 -
  #             %{%s - %s [%s] "%s %s%s %s" %d %s\n} %
  @logger << %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n} %
    [@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.zero? ? "-" : length.to_s),
     @now - @time
    ]
end