class Hanami::Web::RackLogger

Rack logger for Hanami apps

@api private @since 2.0.0

Constants

CONTENT_LENGTH
EMPTY_PARAMS
HTTP_X_FORWARDED_FOR
MICROSECOND
MILLISECOND
PATH_INFO
REMOTE_ADDR
REQUEST_METHOD
ROUTER_PARAMS
SCRIPT_NAME

Attributes

logger[R]

Public Class Methods

new(logger, env: :development) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 126
def initialize(logger, env: :development)
  @logger = UniversalLogger[logger]
  extend(Development) if %i[development test].include?(env)
end

Public Instance Methods

attach(rack_monitor) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 133
def attach(rack_monitor)
  rack_monitor.on :stop do |event|
    log_request event[:env], event[:status], event[:time]
  end

  rack_monitor.on :error do |event|
    # TODO: why we don't provide time on error?
    log_exception event[:env], event[:exception], 500, 0
  end
end
log_exception(env, exception, status, elapsed) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 154
def log_exception(env, exception, status, elapsed)
  logger.tagged(:rack) do
    logger.error(exception, **data(env, status: status, elapsed: elapsed))
  end
end
log_request(env, status, elapsed) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 146
def log_request(env, status, elapsed)
  logger.tagged(:rack) do
    logger.info(**data(env, status: status, elapsed: elapsed))
  end
end

Private Instance Methods

data(env, status:, elapsed:) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 166
def data(env, status:, elapsed:)
  {
    verb: env[REQUEST_METHOD],
    status: status,
    ip: env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR],
    path: "#{env[SCRIPT_NAME]}#{env[PATH_INFO]}",
    length: extract_content_length(env),
    params: env.fetch(ROUTER_PARAMS, EMPTY_PARAMS),
    elapsed: elapsed,
    elapsed_unit: MICROSECOND,
  }
end
extract_content_length(env) click to toggle source

@api private @since 2.0.0

# File lib/hanami/web/rack_logger.rb, line 181
def extract_content_length(env)
  value = env[CONTENT_LENGTH]
  !value || value.to_s == "0" ? "-" : value
end