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