redis_syslog 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -10
- data/lib/redis_syslog.rb +63 -16
- data/lib/redis_syslog/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afb4ce6ef888935609d8323c018383c5bba18948
|
4
|
+
data.tar.gz: e33283b271eda2685cfc61e4518fcfa7dd782b0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7c2811eb787f44dd9531c34ebd60834b923cef06be335673e047f380468aca8ef5ddb3b3f6a4da35e6d7aab3addc137457b534203accfdaffbd06bd12fb5313
|
7
|
+
data.tar.gz: 2803508c6873e78f71b86aeaea24fda32e2eeabacd89266448d7dea35b60b858631b3280ab2188f3ccce7667f1acb372166ad4d842d7dc9b78117c1dbbbe16e5
|
data/README.md
CHANGED
@@ -17,23 +17,44 @@ gem 'redis_syslog'
|
|
17
17
|
@redis = Redis.new
|
18
18
|
|
19
19
|
#Create an instance of RedisSyslog
|
20
|
-
@logger = RedisSyslog.new
|
20
|
+
@logger = RedisSyslog.new @redis
|
21
21
|
```
|
22
22
|
|
23
23
|
3. Profit
|
24
24
|
```ruby
|
25
|
-
#Write a new entry
|
26
|
-
@logger.write "
|
25
|
+
#Write a new entry to the com.bar.sobriety namespace log
|
26
|
+
@logger.write "com.bar.sobriety", "Ordered a beer"
|
27
|
+
@logger.write "com.bar.sobriety", "Hiccup!"
|
27
28
|
|
28
|
-
#Get last
|
29
|
-
@logger.
|
29
|
+
#Get last 2 entries
|
30
|
+
puts @logger.tail "com.bar.sobriety", 2
|
31
|
+
>[{:index => 1, :timestamp=>2014-1027 18:48:28 -0400, :message => "Hiccup!"},
|
32
|
+
{:index => 0, :timestamp=>2014-1027 18:48:28 -0400, :message => "Ordered a beer"}]
|
30
33
|
|
31
|
-
#
|
32
|
-
@logger.
|
34
|
+
#View all namespaces used
|
35
|
+
puts @logger.namespaces ["com.bar.sobriety"]
|
36
|
+
|
37
|
+
#Drop this namespace
|
38
|
+
@logger.delete "com.bar.sobriety"
|
39
|
+
|
40
|
+
#Delete all data including indexes
|
41
|
+
@logger.drop_all
|
33
42
|
```
|
34
43
|
|
35
|
-
|
44
|
+
There are no limits on the number of logs (namespaces) you can have.
|
45
|
+
|
46
|
+
How is it stored?
|
36
47
|
------------
|
37
|
-
|
48
|
+
Each namespace (i.e. each log name) uses the one key with a redis sorted set. `` redis_syslog://#{namespace} ``<br />
|
49
|
+
Then, we have one index key which contains an unsorted set of keys. `` redis_syslog://namespaces ``
|
50
|
+
|
51
|
+
For each entry in the sorted set of some namespace, we follow the simple protocol.
|
52
|
+
```ruby
|
53
|
+
###########################################################################
|
54
|
+
#index - Number that should be monotonically increasing for each entry
|
55
|
+
#timestamp - A time in seconds from unix epoch
|
56
|
+
#message - Your message
|
57
|
+
###########################################################################
|
58
|
+
@encoded_message = "#{index}\n#{timestamp}\n#{message}"
|
59
|
+
```
|
38
60
|
|
39
|
-
`` redis_syslog://#{namespace} ``
|
data/lib/redis_syslog.rb
CHANGED
@@ -1,40 +1,87 @@
|
|
1
1
|
require "redis_syslog/version"
|
2
2
|
|
3
|
+
module RedisSyslog::MessageEncoder
|
4
|
+
#Encode a message with a timestamp fit for inserting into a redis set. This must include the index itself because
|
5
|
+
#a non-unique message could end up getting ignored by redis because it's technically a duplicate if the timestamp
|
6
|
+
#happened to be the same.
|
7
|
+
#We're encoding to INDEX\nTIMESTAMP\nMESSAGE
|
8
|
+
def self.encode(index:, timestamp:, message:)
|
9
|
+
"#{index}\n#{timestamp}\n#{message}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.decode(data)
|
13
|
+
info = data.split("\n")
|
14
|
+
index = info.shift.to_i
|
15
|
+
timestamp = info.shift.to_i
|
16
|
+
|
17
|
+
#Retrieve by inverting the rest
|
18
|
+
message = data.gsub(self.encode(index: index, timestamp: timestamp, message:""), "")
|
19
|
+
|
20
|
+
return {index: index, timestamp: timestamp, message: message}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
3
24
|
class RedisSyslog::RedisSyslog
|
4
25
|
PREFIX = "redis_syslog://"
|
26
|
+
NAMESPACES_LIST_KEY = "redis_syslog://namespaces" #A list of used namespaces
|
5
27
|
|
6
|
-
|
7
|
-
|
28
|
+
#First N characters of key are magic random characters because we are using a sorted set
|
29
|
+
#to store these lists and redis will not allow two duplicate entries (even with different scores)
|
30
|
+
RANDOM_WORD_PREFIX_CHARACTER_COUNT = 8
|
31
|
+
|
32
|
+
#List currently used namespaces
|
33
|
+
def namespaces
|
34
|
+
return @redis.smembers NAMESPACES_LIST_KEY
|
8
35
|
end
|
9
36
|
|
10
|
-
def initialize(
|
11
|
-
@redis =
|
12
|
-
@namespace = namespace
|
37
|
+
def initialize(redis)
|
38
|
+
@redis = redis
|
13
39
|
end
|
14
40
|
|
15
41
|
#This is the actual list key
|
16
|
-
def
|
17
|
-
return "#{PREFIX}#{
|
42
|
+
def _key_for_namespace namespace
|
43
|
+
return "#{PREFIX}#{namespace}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete namespace
|
47
|
+
@redis.del _key_for_namespace(namespace)
|
48
|
+
@redis.srem NAMESPACES_LIST_KEY, namespace
|
18
49
|
end
|
19
50
|
|
20
|
-
def
|
21
|
-
|
51
|
+
def drop_all
|
52
|
+
self.namespaces.each do |namespace|
|
53
|
+
self.delete namespace
|
54
|
+
end
|
55
|
+
|
56
|
+
#For good measure
|
57
|
+
@redis.del NAMESPACES_LIST_KEY
|
22
58
|
end
|
23
59
|
|
24
|
-
def
|
60
|
+
def tail namespace, n=1
|
25
61
|
raise "n cannot be 0" unless n > 0
|
26
62
|
#Return the last N entries of this log
|
27
|
-
results = @redis.zrevrange
|
28
|
-
|
63
|
+
results = @redis.zrevrange _key_for_namespace(namespace), 0, n-1
|
64
|
+
|
65
|
+
results.map! do |result|
|
66
|
+
result = RedisSyslog::MessageEncoder.decode result
|
67
|
+
result[:timestamp] = Time.at(result[:timestamp].to_i)
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
results
|
29
72
|
end
|
30
73
|
|
31
|
-
def write message
|
32
|
-
@redis.
|
74
|
+
def write namespace, message
|
75
|
+
index = @redis.zcard(_key_for_namespace(namespace))
|
76
|
+
encoded_message = RedisSyslog::MessageEncoder.encode index: @redis.zcard(_key_for_namespace(namespace)), timestamp: Time.now.to_i, message: message
|
77
|
+
|
78
|
+
@redis.zadd _key_for_namespace(namespace), index, encoded_message
|
79
|
+
@redis.sadd NAMESPACES_LIST_KEY, namespace
|
33
80
|
end
|
34
81
|
end
|
35
82
|
|
36
83
|
module RedisSyslog
|
37
|
-
def self.new(
|
38
|
-
return RedisSyslog.new
|
84
|
+
def self.new(redis)
|
85
|
+
return RedisSyslog.new redis
|
39
86
|
end
|
40
87
|
end
|
data/lib/redis_syslog/version.rb
CHANGED