class GreenLog::Rack::RequestLogging

Structured request logging.

Constants

Response

Attributes

log_request_bodies[R]
logger[R]

Public Class Methods

new(app, logger, log_request_bodies: false) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 12
def initialize(app, logger, log_request_bodies: false)
  @app = app
  @logger = logger
  @log_request_bodies = log_request_bodies
end

Public Instance Methods

call(env) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 18
def call(env)
  started_at = Time.now
  status, headers, _body = @app.call(env)
ensure
  status ||= 500
  headers ||= {}
  duration = Time.now - started_at
  log(
    request: ::Rack::Request.new(env),
    response: Response.new(status, headers, duration),
  )
end

Protected Instance Methods

log(request:, response:) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 38
def log(request:, response:)
  logger.info(
    "#{request.request_method} #{request.path} #{response.status}",
    request: request_details(request),
    response: response_details(response),
  )
end
optional_request_details(request) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 58
def optional_request_details(request)
  return {} unless log_request_bodies

  {
    body: request_body(request),
  }
end
request_body(request) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 66
def request_body(request)
  original_position = request.body.pos
  request.body.rewind
  request.body.read
ensure
  request.body.seek(original_position)
end
request_details(request) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 46
def request_details(request)
  {
    method: request.request_method,
    scheme: request.scheme,
    host: request.host,
    path: request.path,
    query: request.query_string,
    remote_user: request.env["REMOTE_USER"],
    remote_addr: request.ip,
  }.merge(optional_request_details(request))
end
response_details(response) click to toggle source
# File lib/green_log/rack/request_logging.rb, line 74
def response_details(response)
  {
    status: response.status.to_i,
    length: response.headers["Content-Length"].to_i,
    duration: response.duration.round(3),
  }
end