class RailsSemanticLogger::Rack::Logger

Attributes

logger[R]
started_request_log_level[RW]

Public Class Methods

new(app, taggers = nil) click to toggle source
# File lib/rails_semantic_logger/rack/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/rails_semantic_logger/rack/logger.rb, line 20
def call(env)
  request = ActionDispatch::Request.new(env)

  # Check for named tags (Hash)
  if @taggers && !@taggers.empty?
    tags = @taggers.is_a?(Hash) ? compute_named_tags(request) : compute_tags(request)
    logger.tagged(tags) { call_app(request, env) }
  else
    call_app(request, env)
  end
end

Private Instance Methods

call_app(request, env) click to toggle source
# File lib/rails_semantic_logger/rack/logger.rb, line 37
def call_app(request, env)
  instrumenter        = ActiveSupport::Notifications.instrumenter
  instrumenter_state  = instrumenter.start "request.action_dispatch", request: request
  instrumenter_finish = lambda {
    instrumenter.finish_with_state(instrumenter_state, "request.action_dispatch", request: request)
  }

  logger.send(self.class.started_request_log_level) { started_request_message(request) }
  status, headers, body = @app.call(env)
  body                  = ::Rack::BodyProxy.new(body, &instrumenter_finish)
  [status, headers, body]
rescue Exception
  instrumenter_finish.call
  raise
end
compute_named_tags(request) click to toggle source

Leave out any named tags with a nil value

# File lib/rails_semantic_logger/rack/logger.rb, line 78
def compute_named_tags(request)
  tagged = {}
  @taggers.each_pair do |tag, value|
    resolved    =
      case value
      when Proc
        value.call(request)
      when Symbol
        request.send(value)
      else
        value
      end
    tagged[tag] = resolved unless resolved.nil?
  end
  tagged
end
compute_tags(request) click to toggle source
# File lib/rails_semantic_logger/rack/logger.rb, line 64
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
logger() click to toggle source
# File lib/rails_semantic_logger/rack/logger.rb, line 95
def logger
  self.class.logger
end
started_request_message(request) click to toggle source
# File lib/rails_semantic_logger/rack/logger.rb, line 53
def started_request_message(request)
  {
    message: "Started",
    payload: {
      method: request.request_method,
      path:   request.filtered_path,
      ip:     request.remote_ip
    }
  }
end