module AWS::Core::ClientLogging

def log severity, message

def log severity, message
  config.logger.send(severity, message + "\n") if config.logger
end

def log_client_request(name, options)

def log_client_request(name, options)
  response = nil
  time = Benchmark.measure do
    response = yield
  end
  if options[:async]
    response.on_complete do
      log_client_request_on_success(name, options, response, time)
    end
  else
    log_client_request_on_success(name, options, response, time)
  end
  response
end

def log_client_request_on_success(method_name, options, response, time)

def log_client_request_on_success(method_name, options, response, time)
  status = response.http_response.status
  service = self.class.service_name
  pattern = "[AWS %s %s %.06f] %s(%s)"
  parts = [service, status, time.real, method_name, sanitize_options(options)]
  severity = :info
  if response.error
    pattern += " %s: %s"
    parts << response.error.class
    parts << response.error.message
    severity = :error
  end
  if response.cached
    pattern << " [CACHED]"
  end
  log(severity, pattern % parts)
end

def sanitize_array array

def sanitize_array array
  "[" + array.map { |v| sanitize_value(v) }.join(",") + "]"
end

def sanitize_file file

def sanitize_file file
  "#<File:#{file.path} (#{File.size(file.path)} bytes)>"
end

def sanitize_hash hash

def sanitize_hash hash
  hash.map do |k,v|
    "#{sanitize_value(k)}=>#{sanitize_value(v)}"
  end.sort.join(",")
end

def sanitize_options(options)

Other tags:
    Private: -
def sanitize_options(options)
  sanitize_hash(options)
end

def sanitize_string str

def sanitize_string str
  inspected = str.inspect
  if inspected.size > config.logger_truncate_strings_at
    summarize_string(str)
  else
    inspected
  end
end

def sanitize_value(value)

def sanitize_value(value)
  case value
  when Hash
    '{' + sanitize_hash(value) + '}'
  when Array
    sanitize_array(value)
  when File
    sanitize_file(value)
  when String
    sanitize_string(value)
  else
    value.inspect
  end
end

def summarize_string str

def summarize_string str
  # skip the openning "
  string_start = str.inspect[1,config.logger_truncate_strings_at]
  "#<String \"#{string_start}\" ... (#{str.size} characters)>"
end