2
Simple example of using zmq log handlers
4
This starts a number of subprocesses with PUBHandlers that generate
5
log messages at a regular interval. The main process has a SUB socket,
6
which aggregates and logs all of the messages to the root logger.
10
from multiprocessing import Process
5
from zmq.eventloop import *
17
from zmq.log.handlers import PUBHandler
19
LOG_LEVELS = (logging.DEBUG, logging.INFO, logging.WARN, logging.ERROR, logging.CRITICAL)
21
def sub_logger(port, level=logging.DEBUG):
9
23
sub = ctx.socket(zmq.SUB)
10
sub.connect('tcp://127.0.0.1:%i'%port)
11
sub.setsockopt(zmq.SUBSCRIBE,"")
13
message = sub.recv_multipart()
18
getattr(logging, name)(*msg)
22
class ZLogger(object):
24
def __init__(self,fname=None):
26
logging.config.fileConfig(fname)
27
self.ctx = zmq.Context()
28
self.pub = self.ctx.socket(zmq.PUB)
29
self.port = self.pub.bind_to_random_port('tcp://127.0.0.1')
30
self.sub_proc = multiprocessing.Process(target=sub_logger, args=(self.port,))
24
sub.bind('tcp://127.0.0.1:%i' % port)
25
sub.setsockopt(zmq.SUBSCRIBE, "")
26
logging.basicConfig(level=level)
29
level, message = sub.recv_multipart()
30
if message.endswith('\n'):
31
# trim trailing newline, which will get appended again
32
message = message[:-1]
33
log = getattr(logging, level.lower())
36
def log_worker(port, interval=1, level=logging.DEBUG):
38
pub = ctx.socket(zmq.PUB)
39
pub.connect('tcp://127.0.0.1:%i' % port)
41
logger = logging.getLogger(str(os.getpid()))
42
logger.setLevel(level)
43
handler = PUBHandler(pub)
44
logger.addHandler(handler)
45
print "starting logger at %i with level=%s" % (os.getpid(), level)
48
level = random.choice(LOG_LEVELS)
49
logger.log(level, "Hello from %i!" % os.getpid())
52
if __name__ == '__main__':
60
# start the log generators
61
workers = [ Process(target=log_worker, args=(port,), kwargs=dict(level=random.choice(LOG_LEVELS))) for i in range(n) ]
62
[ w.start() for w in workers ]
64
# start the log watcher
67
except KeyboardInterrupt:
34
def log(self, level, msg):
35
self.pub.send_multipart(['log', str(level), msg])
38
self.pub.send_multipart(['warn', msg])
41
self.pub.send_multipart(['error', msg])
70
[ w.terminate() for w in workers ]