Sha256: 2a6a3d547fba3db6a3ff63f7bb9fa10cc64e566653b641b9df1f262d54a93155
Contents?: true
Size: 1.73 KB
Versions: 8
Compression:
Stored size: 1.73 KB
Contents
module Services module Logger class Redis META_CLASSES = [ NilClass, TrueClass, FalseClass, Symbol, String, Numeric ] InvalidMetaError = Class.new(StandardError) EmptyResponseFromRedisMultiError = Class.new(StandardError) def initialize(redis, key = 'logs') @redis, @key = redis, key end 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 def size @redis.llen @key end def fetch @redis.lrange(@key, 0, -1).map(&method(:log_entry_from_json)) end 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 private def log_entry_from_json(json) data = JSON.load(json) data['time'] = Time.at(data['time']) data end 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 end end end
Version data entries
8 entries across 8 versions & 1 rubygems