Sha256: 0ea295761c733cb8afc53064b6d55f0c624042b3b5c3c230f9533e51859c65c4

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

require 'rack/access_log/version'
require 'rack'
require 'benchmark'

module Rack
  class AccessLog
    def initialize(app, logger, config = {})
      @app = app
      @logger = logger
      configure!(config)
    end

    def call(env)
      status, header, body_lines, realtime = next_middleware_call_with_benchmarking(env)
      @logger.info(create_log_message(env, status, realtime)) if tracked?(env)
      [status, header, body_lines]
    end

    private

    def tracked?(env)
      !@exclude_paths.include?(env[Rack::PATH_INFO])
    end

    def create_log_message(env, status, realtime)
      {
        execution_time_sec: realtime,
        remote_ip: remote_ip_by(env),
        request_method: env[Rack::REQUEST_METHOD],
        request_path: env[Rack::PATH_INFO],
        query_string: env[Rack::QUERY_STRING],
        response_status_code: status.to_i
      }
    end

    def remote_ip_by(env)
      env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR'] || '-'
    end

    def next_middleware_call_with_benchmarking(env)
      status = nil
      header = nil
      body_lines = nil
      realtime = Benchmark.realtime do
        status, header, body_lines = @app.call(env)
      end
      [status, header, body_lines, realtime]
    end

    def configure!(config)
      @exclude_paths = [config.delete(:exclude_path)].flatten.compact.freeze
      check_for_unrequired_options(config)
    end

    def check_for_unrequired_options(config)
      invalid_config_options = config.keys
      raise("invalid config: #{invalid_config_options.join(', ')}") unless invalid_config_options.empty?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-access_log-0.1.0 lib/rack/access_log.rb