This is a quite cool little class I wrote for receiving log messages over sockets. It is launched as a thread and uses a python Queue to store messages for retrieval by consumers in your main program. It also means I can have multiple sockets for different log sources.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#!/bin/python2.6 import threading from Queue import Queue import socket class LoggingReceiver(threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) self.host = host self.port = port self.msg_queue = Queue() self.running = True self.max_waiting_connections = 10 self.daemon = True self.debug = True def run(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((self.host, self.port)) s.listen(self.max_waiting_connections) while self.running: accepted_socket, address = s.accept() self.debug_msg('Received connection from {0}'.format(address)) msg = "" while self.running: data = accepted_socket.recv(1024) if not data: break msg += data self.add_message(msg, address) s.close() def debug_msg(self, msg): if self.debug: print msg def add_message(self, msg, source): self.debug_msg('{0} sent message - {1}'.format(source, msg)) self.msg_queue.put(msg) def get_message(self): if not self.msg_queue.empty(): msg = self.msg_queue.get() self.msg_queue.task_done() return msg def flush_queue(self): while not self.queue.empty(): self.msg_queue.get(block=True) self.msg_queue.task_done() def stop(self): self.debug_msg('Stopping main loop.') self.running = False |
Questions? Comments?