Module: WEBrick::AccessLog

Defined in:
lib/webrick/accesslog.rb

Overview

AccessLog provides logging to various files in various formats.

Multiple logs may be written to at the same time:

access_log = [
  [$stderr, WEBrick::AccessLog::COMMON_LOG_FORMAT],
  [$stderr, WEBrick::AccessLog::REFERER_LOG_FORMAT],
]

server = WEBrick::HTTPServer.new :AccessLog => access_log

Custom log formats may be defined. WEBrick::AccessLog provides a subset of the formatting from Apache's mod_log_config httpd.apache.org/docs/mod/mod_log_config.html#formats. See AccessLog::setup_params for a list of supported options

Defined Under Namespace

Classes: AccessLogError

Constant Summary collapse

CLF_TIME_FORMAT =

The Common Log Format's time format

"[%d/%b/%Y:%H:%M:%S %Z]"
COMMON_LOG_FORMAT =

Common Log Format

"%h %l %u %t \"%r\" %s %b"
CLF =

Short alias for Common Log Format

COMMON_LOG_FORMAT
REFERER_LOG_FORMAT =

Referer Log Format

"%{Referer}i -> %U"
AGENT_LOG_FORMAT =

User-Agent Log Format

"%{User-Agent}i"
COMBINED_LOG_FORMAT =

Combined Log Format

"#{CLF} \"%{Referer}i\" \"%{User-agent}i\""

Class Method Summary collapse

Class Method Details

.escape(data) ⇒ Object

Escapes control characters in data



150
151
152
153
154
155
156
# File 'lib/webrick/accesslog.rb', line 150

def escape(data)
  if data.tainted?
    data.gsub(/[[:cntrl:]\\]+/) {$&.dump[1...-1]}.untaint
  else
    data
  end
end

.format(format_string, params) ⇒ Object

Formats params according to format_string which is described in setup_params.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/webrick/accesslog.rb', line 122

def format(format_string, params)
  format_string.gsub(/\%(?:\{(.*?)\})?>?([a-zA-Z%])/){
     param, spec = $1, $2
     case spec[0]
     when ?e, ?i, ?n, ?o
       raise AccessLogError,
         "parameter is required for \"#{spec}\"" unless param
       (param = params[spec][param]) ? escape(param) : "-"
     when ?t
       params[spec].strftime(param || CLF_TIME_FORMAT)
     when ?p
       case param
       when 'remote'
         escape(params["i"].peeraddr[1].to_s)
       else
         escape(params["p"].to_s)
       end
     when ?%
       "%"
     else
       escape(params[spec].to_s)
     end
  }
end

.setup_params(config, req, res) ⇒ Object

This format specification is a subset of mod_log_config of Apache:

%a

Remote IP address

%b

Total response size

%evariable

Given variable in ENV

%f

Response filename

%h

Remote host name

%headeri

Given request header

%l

Remote logname, always “-”

%m

Request method

%attrn

Given request attribute from req.attributes

%headero

Given response header

%p

Server's request port

%formatp

The canonical port of the server serving the request or the actual port or the client's actual port. Valid formats are canonical, local or remote.

%q

Request query string

%r

First line of the request

%s

Request status

%t

Time the request was received

%T

Time taken to process the request

%u

Remote user from auth

%U

Unparsed URI

%%

Literal %



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/webrick/accesslog.rb', line 94

def setup_params(config, req, res)
  params = Hash.new("")
  params["a"] = req.peeraddr[3]
  params["b"] = res.sent_size
  params["e"] = ENV
  params["f"] = res.filename || ""
  params["h"] = req.peeraddr[2]
  params["i"] = req
  params["l"] = "-"
  params["m"] = req.request_method
  params["n"] = req.attributes
  params["o"] = res
  params["p"] = req.port
  params["q"] = req.query_string
  params["r"] = req.request_line.sub(/\x0d?\x0a\z/o, '')
  params["s"] = res.status       # won't support "%>s"
  params["t"] = req.request_time
  params["T"] = Time.now - req.request_time
  params["u"] = req.user || "-"
  params["U"] = req.unparsed_uri
  params["v"] = config[:ServerName]
  params
end