pjanuario/logger-facade-ruby

View on GitHub
lib/logger_facade/middleware/rack.rb

Summary

Maintainability
A
0 mins
Test Coverage
module LoggerFacade::Middleware
  class Rack < Rack::CommonLogger
    def initialize(app, logger=nil)
      log = LoggerFacade::Manager.get_logger("RackLogger")
      @format = '%s "%s %s" %d %s %0.4f'
      super(app, log)
    end

    private

    def log(env, status, header, began_at)
      metadata = get_metadata(env, status, header, began_at)

      msg = @format % [
        metadata["clientip"] || "-",
        metadata["verb"],
        metadata["request"],
        metadata["response"].to_s[0..3],
        metadata["bytes"],
        metadata["request_time"] ]

      severity = get_severity(metadata["response"])
      @logger.send(severity, msg, metadata)
    end

    def get_metadata(env, status, header, began_at)
      length = extract_content_length(header)
      qs = env["QUERY_STRING"].empty? ? "" : "?#{env["QUERY_STRING"]}"
      {
        'clientip'     => env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"],
        'verb'        => env["REQUEST_METHOD"],
        'request'          => "#{env["PATH_INFO"]}#{qs}",
        'http_version'  => env["HTTP_VERSION"],
        'response'        => status.to_s,
        'bytes'          => (length || "").to_i,
        'referrer'          => env["HTTP_REFERER"],
        'agent'         => env['HTTP_USER_AGENT'],
        'request_time' => Time.now - began_at,
        'request_full_url' => env['REQUEST_URI']
      }
    end

    def get_severity(status)
      status = status.to_i
      if status >= 400 and status < 500
        :warn
      elsif status >= 500
        :error
      else
        :info
      end
    end

  end
end