class AccessWatch::Logger

Attributes

client[R]

Public Class Methods

new(config) click to toggle source
# File lib/access_watch/logger.rb, line 5
def initialize(config)
  @client = AccessWatch::Client.new(config)
  @parameter_filter = ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters)
  ActiveSupport::Notifications.subscribe("process_action.action_controller", &method(:after_http_request))
end

Public Instance Methods

after_http_request(name, start, finish, id, payload) click to toggle source
# File lib/access_watch/logger.rb, line 11
def after_http_request(name, start, finish, id, payload)
  request = payload[:headers].instance_variable_get(:@req)
  post_request(
    time: start,
    address: request.remote_ip,
    host: request.host,
    request: {
      # TODO: Check if is SERVER_PROTOCOL comes from client browser
      # "protocol": "HTTP/1.1",
      method: payload[:method],
      scheme: URI(request.original_url).scheme,
      host: request.host,
      port: request.port,
      url: payload[:path],
      headers: extract_headers(payload)
    },
    response: {status: payload[:status]},
  )
end

Private Instance Methods

extract_headers(payload) click to toggle source
# File lib/access_watch/logger.rb, line 53
def extract_headers(payload)
  filter_sensitive_data(filter_environment_variables(payload[:headers].env))
end
filter_environment_variables(hash) click to toggle source
# File lib/access_watch/logger.rb, line 49
def filter_environment_variables(hash)
  hash.clone.keep_if { |key,value| key == key.upcase }
end
filter_sensitive_data(hash) click to toggle source
# File lib/access_watch/logger.rb, line 45
def filter_sensitive_data(hash)
  @parameter_filter ? @parameter_filter.filter(hash) : hash
end
post_async(path, data) click to toggle source
# File lib/access_watch/logger.rb, line 41
def post_async(path, data)
  Thread.new { client.post(path, data) }
end
post_request(data) click to toggle source

Private methods ###

# File lib/access_watch/logger.rb, line 37
def post_request(data)
  post_async("log".freeze, data)
end