class TimeBandits::Rack::Logger

Sets log tags, logs the request, calls the app, and flushes the logs.

Public Class Methods

new(app, taggers = nil) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 11
def initialize(app, taggers = nil)
  @app          = app
  @taggers      = taggers || Rails.application.config.log_tags || []
  @instrumenter = ActiveSupport::Notifications.instrumenter
end

Public Instance Methods

call(env) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 17
def call(env)
  request = ActionDispatch::Request.new(env)

  if logger.respond_to?(:tagged) && !@taggers.empty?
    logger.tagged(compute_tags(request)) { call_app(request, env) }
  else
    call_app(request, env)
  end
end

Protected Instance Methods

call_app(request, env) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 29
def call_app(request, env)
  start_time = Time.now
  start(request, start_time)
  resp = @app.call(env)
  resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
  resp
rescue
  finish(request)
  raise
ensure
  completed(request, (Time.now - start_time) * 1000, resp)
  ActiveSupport::LogSubscriber.flush_all!
end
compute_tags(request) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 52
def compute_tags(request)
  @taggers.collect do |tag|
    case tag
    when Proc
      tag.call(request)
    when Symbol
      request.send(tag)
    else
      tag
    end
  end
end
started_request_message(request, start_time=Time.now) click to toggle source

Started GET “/session/new” for 127.0.0.1 at 2012-09-26 14:51:42 -0700

# File lib/time_bandits/rack/logger.rb, line 44
def started_request_message(request, start_time=Time.now)
  'Started %s "%s" for %s at %s' % [
    request.request_method,
    request.filtered_path,
    request.ip,
    start_time.to_default_s ]
end

Private Instance Methods

completed(request, run_time, resp) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 76
def completed(request, run_time, resp)
  status = resp ? resp.first.to_i : 500
  completed_info = Thread.current.thread_variable_get(:time_bandits_completed_info)
  additions = completed_info[1] if completed_info
  message = "Completed #{status} #{::Rack::Utils::HTTP_STATUS_CODES[status]} in %.1fms" % run_time
  message << " (#{additions.join(' | ')})" unless additions.blank?
  logger.info message
end
finish(request) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 85
def finish(request)
  @instrumenter.finish 'action_dispatch.request', request: request
end
logger() click to toggle source
# File lib/time_bandits/rack/logger.rb, line 89
def logger
  @logger ||= Rails.logger
end
start(request, start_time) click to toggle source
# File lib/time_bandits/rack/logger.rb, line 67
def start(request, start_time)
  TimeBandits.reset
  Thread.current.thread_variable_set(:time_bandits_completed_info, nil)
  @instrumenter.start 'action_dispatch.request', request: request

  logger.debug ""
  logger.info started_request_message(request, start_time)
end