class Services::Logger::Redis

Constants

EmptyResponseFromRedisMultiError
InvalidMetaError
META_CLASSES

Public Class Methods

new(redis, key = 'logs') click to toggle source
# File lib/services/logger/redis.rb, line 16
def initialize(redis, key = 'logs')
  @redis, @key = redis, key
end

Public Instance Methods

clear() click to toggle source
# File lib/services/logger/redis.rb, line 41
def clear
  response = 3.tries on: EmptyResponseFromRedisMultiError do
    @redis.multi do
      @redis.lrange @key, 0, -1
      @redis.del @key
    end or raise EmptyResponseFromRedisMultiError
  end
  response.first.map(&method(:log_entry_from_json))
end
fetch() click to toggle source
# File lib/services/logger/redis.rb, line 37
def fetch
  @redis.lrange(@key, 0, -1).map(&method(:log_entry_from_json))
end
log(message, meta = {}, severity = 'info') click to toggle source
# File lib/services/logger/redis.rb, line 20
def log(message, meta = {}, severity = 'info')
  # Allow only simple data types in meta
  raise InvalidMetaError, "Meta keys and values must be of one of the following classes: #{META_CLASSES.join(', ')}" if meta_includes_invalid_values?(meta)

  value = {
    time:     Time.now.to_i,
    message:  message.to_s,
    severity: severity.to_s,
    meta:     meta
  }
  @redis.lpush @key, value.to_json
end
size() click to toggle source
# File lib/services/logger/redis.rb, line 33
def size
  @redis.llen @key
end

Private Instance Methods

log_entry_from_json(json) click to toggle source
# File lib/services/logger/redis.rb, line 53
def log_entry_from_json(json)
  data = JSON.load(json)
  data['time'] = Time.at(data['time'])
  data
end
meta_includes_invalid_values?(meta) click to toggle source
# File lib/services/logger/redis.rb, line 59
def meta_includes_invalid_values?(meta)
  [meta.values, meta.keys].any? do |elements|
    elements.any? do |element|
      META_CLASSES.none? do |klass|
        element.class <= klass
      end
    end
  end
end