diff options
Diffstat (limited to 'logutils/redis.py')
-rw-r--r-- | logutils/redis.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/logutils/redis.py b/logutils/redis.py new file mode 100644 index 0000000..2d7c6bf --- /dev/null +++ b/logutils/redis.py @@ -0,0 +1,72 @@ +""" +This module contains classes which help you work with Redis queues. +""" + +from logutils.queue import QueueHandler, QueueListener +try: + import cPickle as pickle +except ImportError: + import pickle + +class RedisQueueHandler(QueueHandler): + """ + A QueueHandler implementation which pushes pickled + records to a Redis queue using a specified key. + + :param key: The key to use for the queue. Defaults to + "python.logging". + :param redis: If specified, this instance is used to + communicate with a Redis instance. + :param limit: If specified, the queue is restricted to + have only this many elements. + """ + def __init__(self, key='python.logging', redis=None, limit=0): + if redis is None: + from redis import Redis + redis = Redis() + self.key = key + assert limit >= 0 + self.limit = limit + QueueHandler.__init__(self, redis) + + def enqueue(self, record): + s = pickle.dumps(vars(record)) + self.queue.rpush(self.key, s) + if self.limit: + self.queue.ltrim(self.key, -self.limit, -1) + +class RedisQueueListener(QueueListener): + """ + A QueueListener implementation which fetches pickled + records from a Redis queue using a specified key. + + :param key: The key to use for the queue. Defaults to + "python.logging". + :param redis: If specified, this instance is used to + communicate with a Redis instance. + """ + def __init__(self, *handlers, **kwargs): + redis = kwargs.get('redis') + if redis is None: + from redis import Redis + redis = Redis() + self.key = kwargs.get('key', 'python.logging') + QueueListener.__init__(self, redis, *handlers) + + def dequeue(self, block): + """ + Dequeue and return a record. + """ + if block: + s = self.queue.blpop(self.key)[1] + else: + s = self.queue.lpop(self.key) + if not s: + record = None + else: + record = pickle.loads(s) + return record + + def enqueue_sentinel(self): + self.queue.rpush(self.key, '') + |