class EventSpider::Logger

Constants

ERROR_FORMAT
FILTER
REQUEST_FORMAT
RESPONSE_FORMAT

Public Class Methods

new(app, taggers = nil) click to toggle source
# File lib/logger.rb, line 15
def initialize(app, taggers = nil)
  @app = app
  @taggers = taggers || []
end

Public Instance Methods

call(env) click to toggle source
# File lib/logger.rb, line 20
def call(env)
  request = Rack::Request.new(env)

  if logger.respond_to?(:tagged)
    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/logger.rb, line 31
def call_app(request, env)
    # Put some space between requests in development logs.
  if development?
    logger.debug ''
  end

  began_at = Time.now
  resp = @app.call(env)
  status, header, body = resp
  logger.info started_request_message(request)
  logger.info started_response_message(status, header, body, began_at)

  instrumenter = ActiveSupport::Notifications.instrumenter
  instrumenter.start 'request', request: request

  resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
  resp
rescue Exception => e
  error_logger.debug ''
  error_logger.info started_request_message(request)
  error_logger.info started_error_message(e)

  logger.debug ''
  logger.info started_request_message(request)
  logger.info started_error_message(e)

  finish(request)
  raise if development?
ensure
  ActiveSupport::LogSubscriber.flush_all!
end
compute_tags(request) click to toggle source
# File lib/logger.rb, line 93
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_error_message(e) click to toggle source
# File lib/logger.rb, line 86
def started_error_message(e)
  ERROR_FORMAT % [
    e,
    e.backtrace.join("\n")
  ]
end
started_request_message(request) click to toggle source
# File lib/logger.rb, line 63
def started_request_message(request)
  REQUEST_FORMAT % [
    request.ip,
    request.request_method,
    request.env['REQUEST_URI'],
    Time.now.to_default_s,
    request.user_agent,
    request_headers(request),
    filter_params(request.params)
  ]
end
started_response_message(status, header, body, began_at) click to toggle source
# File lib/logger.rb, line 75
def started_response_message(status, header, body, began_at)
  now = Time.now
  RESPONSE_FORMAT % [
    status,
    now - began_at,
    header,
    body.length,
    body.present? && status < 400 ? body.body.first.truncate(1000) : ''
  ]
end

Private Instance Methods

development?() click to toggle source
# File lib/logger.rb, line 112
def development?
  ENV['RACK_ENV']
end
error_logger() click to toggle source
# File lib/logger.rb, line 120
def error_logger
  ActiveSupport::Logger.new("log/#{ENV['RACK_ENV']}_error.log")
end
filter_params(original_params) click to toggle source
# File lib/logger.rb, line 131
def filter_params(original_params)
  filtered_params = {}

  original_params.each do |key, value|
    if FILTER.include? key
      filtered_params[key] = '敏感词'
    else
      filtered_params[key] = value
    end
  end

  filtered_params
end
finish(request) click to toggle source
# File lib/logger.rb, line 107
def finish(request)
  instrumenter = ActiveSupport::Notifications.instrumenter
  instrumenter.finish 'request', request: request
end
logger() click to toggle source
# File lib/logger.rb, line 116
def logger
  ActiveSupport::Logger.new("log/#{ENV['RACK_ENV']}.log")
end
request_headers(request) click to toggle source
# File lib/logger.rb, line 124
def request_headers(request)
  request.env.select {|k,v| k.start_with? 'HTTP_'}
             .collect { |pair| [pair[0].sub(/^HTTP_/, ''), pair[1]] }
             .collect { |pair| pair.join(": ") }
             .sort
end