Class: Reaxar::Middleware::Log

Inherits:
MiddlewareAbstract show all
Defined in:
lib/reaxar/middleware/log.rb

Overview

Middleware for logging HTTP requests and responses.

Examples:

Usage

logger = Logger.new($stdout)
middleware = Reaxar::Middleware::Log.new(logger)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(logger = nil) ⇒ Log

Initializes the Log middleware.

Parameters:

  • logger (Logger, nil) (defaults to: nil)

    Logger instance for output (defaults to $logger).



19
20
21
22
# File 'lib/reaxar/middleware/log.rb', line 19

def initialize(logger = nil)
  super()
  @logger = logger || Logger.new($stdout)
end

Instance Attribute Details

#loggerLogger (readonly)

Returns The logger used for output.

Returns:

  • (Logger)

    The logger used for output.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/reaxar/middleware/log.rb', line 16

class Log < MiddlewareAbstract
  # Initializes the Log middleware.
  # @param logger [Logger, nil] Logger instance for output (defaults to $logger).
  def initialize(logger = nil)
    super()
    @logger = logger || Logger.new($stdout)
  end

  # Logs information about the HTTP request.чц
  # @param request [Hash] The request data.
  # @return [Hash] The original request.
  def process_request(request)
    @start_time = Time.now
    log_request_info(request, @start_time)
    log_request_headers(request)
    request
  end

  # Logs information about the HTTP response.
  # @param response [Object] The HTTP response.
  # @param request [Hash] The original request.
  # @return [Object] The HTTP response.
  def process_response(response, request)
    duration = Time.now - @start_time
    status = response.respond_to?(:status) ? response.status : '???'
    log_response_info(request, response, status, duration)
    log_response_headers(response)
    response
  end

  private

  def log_request_info(request, _start_time)
    @logger.info("➡️  [#{@start_time.iso8601}] #{request[:method].upcase} #{request[:uri]}")
  end

  def log_request_headers(request)
    return unless request[:headers] && !request[:headers].empty?

    @logger.info('Request headers:')
    request[:headers].each do |key, value|
      @logger.info("  #{key}: #{value}")
    end
  end

  def log_response_info(request, _response, status, duration)
    @logger.info("⬅️  [#{Time.now.iso8601}] #{request[:method].upcase} #{request[:uri]} - " \
    "#{status} (#{duration.round(2)}s)")
  end

  def log_response_headers(response)
    return unless response.respond_to?(:headers) && response.headers && !response.headers.empty?

    @logger.info('Response headers:')
    response.headers.each do |key, value|
      @logger.info("  #{key}: #{value}")
    end
  end
end

Instance Method Details

#process_request(request) ⇒ Hash

Logs information about the HTTP request.чц

Parameters:

  • request (Hash)

    The request data.

Returns:

  • (Hash)

    The original request.



27
28
29
30
31
32
# File 'lib/reaxar/middleware/log.rb', line 27

def process_request(request)
  @start_time = Time.now
  log_request_info(request, @start_time)
  log_request_headers(request)
  request
end

#process_response(response, request) ⇒ Object

Logs information about the HTTP response.

Parameters:

  • response (Object)

    The HTTP response.

  • request (Hash)

    The original request.

Returns:

  • (Object)

    The HTTP response.



38
39
40
41
42
43
44
# File 'lib/reaxar/middleware/log.rb', line 38

def process_response(response, request)
  duration = Time.now - @start_time
  status = response.respond_to?(:status) ? response.status : '???'
  log_response_info(request, response, status, duration)
  log_response_headers(response)
  response
end