def start_logPublisher(self, publish): log = logging.getLogger() log.info('Activating log publisher on port {}'.format(publish)) zmq_log_handler = PUBHandler("tcp://*:{}".format(publish)) zmq_log_handler.setFormatter( logging.Formatter(fmt='{asctime}|{message}', style='{')) zmq_log_handler.root_topic = self.nodename log.addHandler(zmq_log_handler) if self.camwatcher: handoff = { 'node': self.nodename, 'log': self.publish_log, 'video': self.publish_cam, 'host': socket.gethostname() } msg = "CameraUp|" + json.dumps(handoff) try: with zmq.Context().socket(zmq.REQ) as sock: log.debug('connecting to ' + self.camwatcher) sock.connect(self.camwatcher) sock.send(msg.encode("ascii")) resp = sock.recv().decode("ascii") except Exception as ex: log.exception('Unable to connect with camwatcher:' + ex) sys.exit() log.handlers.remove( log.handlers[0]) # OK, all logging over PUB socket only log.setLevel(logging.INFO) return log
class LogPublisher(object): """ Centralized logger publisher, used in MP.Process.run() to send log message to log collector. """ def __init__(self, ip="127.0.0.1", port=8000): self._logger = logging.getLogger("LogPublisher") self._logger.setLevel(logging.DEBUG) self.ctx = zmq.Context() self.socket = self.ctx.socket(zmq.PUB) self.socket.bind("tcp://{}:{}".format(ip, port)) self.handler = PUBHandler(self.socket) self.format = logging.Formatter( "[%(filename)s:%(lineno)d] %(levelname)s %(message)s") self.handler.setFormatter(self.format) self._logger.addHandler(self.handler) @property def logger(self): return self._logger