Created
September 14, 2010 11:56
-
-
Save vsajip/578918 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import logging | |
import zmq | |
class QueueHandler(logging.Handler): | |
""" | |
This handler sends events to a queue. Typically, it would be used together | |
with a multiprocessing Queue to centralise logging to file in one process | |
(in a multi-process application), so as to avoid file write contention | |
between processes. | |
This code is new in Python 3.2, but this class can be copy pasted into | |
user code for use with earlier Python versions. | |
""" | |
def __init__(self, queue): | |
""" | |
Initialise an instance, using the passed queue. | |
""" | |
logging.Handler.__init__(self) | |
self.queue = queue | |
def enqueue(self, record): | |
""" | |
Enqueue a record. | |
The base implementation uses put_nowait. You may want to override | |
this method if you want to use blocking, timeouts or custom queue | |
implementations. | |
""" | |
self.queue.put_nowait(record) | |
def emit(self, record): | |
""" | |
Emit a record. | |
Writes the LogRecord to the queue, preparing it for pickling first. | |
""" | |
try: | |
# The format operation gets traceback text into record.exc_text | |
# (if there's exception data), and also puts the message into | |
# record.message. We can then use this to replace the original | |
# msg + args, as these might be unpickleable. We also zap the | |
# exc_info attribute, as it's no longer needed and, if not None, | |
# will typically not be pickleable. | |
self.format(record) | |
record.msg = record.message | |
record.args = None | |
record.exc_info = None | |
self.enqueue(record) | |
except (KeyboardInterrupt, SystemExit): | |
raise | |
except: | |
self.handleError(record) | |
class ZeroMQSocketHandler(QueueHandler): | |
def __init__(self, uri, socktype=zmq.PUB, ctx=None): | |
self.ctx = ctx or zmq.Context() | |
socket = zmq.Socket(self.ctx, socktype) | |
socket.bind(uri) | |
QueueHandler.__init__(self, socket) | |
def enqueue(self, record): | |
data = json.dumps(record.__dict__) | |
self.queue.send(data) | |
def close(self): | |
self.queue.close() | |
def main(): | |
print('Enter messages to send:') | |
h = ZeroMQSocketHandler('tcp://*:5556') | |
logger = logging.getLogger() | |
logger.addHandler(h) | |
try: | |
while True: | |
s = raw_input('> ') | |
logger.warning(s) | |
finally: | |
logger.removeHandler(h) | |
h.close() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment