class LoggerClient(Thread): _singleton = None @staticmethod def getInstance(): if not LoggerClient._singleton: client = LoggerClient() client.start() LoggerClient._singleton = client return LoggerClient._singleton def __init__(self): super(LoggerClient, self).__init__() self.parent = current_thread() self._stopped = False self._queue = Queue.Queue() self._client = BinderClient("log_writer") def stop(self): self._client.close() self._stopped= True def _send_message(self): msg = self._queue.get() self._client.send(msg) def run(self): while not self._stopped: self._send_message() # keep logging until the queue is empty, even after the parent has died while not self._queue.empty(): self._send_message() def _send(self, level, tag, msg, **kwargs): to_send = {'type': 'log', 'level': level, 'msg': msg, 'tag': tag} to_send.update(kwargs) self._queue.put(to_send) def debug(self, tag, msg, **kwargs): self._send(logging.DEBUG, tag, msg, **kwargs) def info(self, tag, msg, **kwargs): self._send(logging.INFO, tag, msg, **kwargs) def warn(self, tag, msg, **kwargs): self._send(logging.WARNING, tag, msg, **kwargs) def error(self, tag, msg, **kwargs): self._send(logging.ERROR, tag, msg, **kwargs)
class LoggerClient(Thread): _singleton = None @staticmethod def getInstance(): if not LoggerClient._singleton: client = LoggerClient() client.start() LoggerClient._singleton = client return LoggerClient._singleton def __init__(self): super(LoggerClient, self).__init__() self.parent = current_thread() self._stopped = False self._queue = Queue.Queue() self._client = BinderClient("log_writer") def stop(self): self._client.close() self._stopped = True def _send_message(self): msg = self._queue.get() self._client.send(msg) def run(self): while not self._stopped: self._send_message() # keep logging until the queue is empty, even after the parent has died while not self._queue.empty(): self._send_message() def _send(self, level, tag, msg, **kwargs): to_send = {'type': 'log', 'level': level, 'msg': msg, 'tag': tag} to_send.update(kwargs) self._queue.put(to_send) def debug(self, tag, msg, **kwargs): self._send(logging.DEBUG, tag, msg, **kwargs) def info(self, tag, msg, **kwargs): self._send(logging.INFO, tag, msg, **kwargs) def warn(self, tag, msg, **kwargs): self._send(logging.WARNING, tag, msg, **kwargs) def error(self, tag, msg, **kwargs): self._send(logging.ERROR, tag, msg, **kwargs)
def run(self): buf = Queue.Queue() def buffered_cb(msg): buf.put(msg) self._pubsub_cb = buffered_cb PubSubStreamer.get_instance().add_app_callback(self._app, self._pubsub_cb) lines = [] bc = BinderClient("log_reader") rsp = bc.send({"type": "get", "app": self._app, "since": self._start_time}) if rsp["type"] == "success": lines = rsp["msg"].split("\n") else: error_log("LoggerClient", "read_stream failure for app {}: {}".format(self._app, rsp)) return bc.close() # exhaust all lines from the get request last_time = None for line in lines: last_time = LogSettings.EXTRACT_TIME(line) self._cb(line) if last_time: last_time = time.strptime(last_time, LogSettings.TIME_FORMAT) # now start reading the subscriber output (starting strictly after last_time) while not self._stopped: try: timeout = 0.05 line = buf.get(timeout=timeout) line_time = time.strptime(LogSettings.EXTRACT_TIME(line), LogSettings.TIME_FORMAT) if not last_time or line_time > last_time: self._cb(line) except Queue.Empty: continue
def get_app_logs(app, start_time, filtered=False): lines = [] bc = BinderClient("log_reader") rsp = bc.send({ "type": "get", "app": app, "since": start_time, "filtered": filtered }) if rsp and rsp["type"] == "success": lines = rsp["msg"].split("\n") else: error_log("LoggerClient", "read_stream failure for app {}: {}".format(app, rsp)) bc.close() return lines
def get_app_logs(app, start_time): lines = [] bc = BinderClient("log_reader") rsp = bc.send({"type": "get", "app": app, "since": start_time}) if rsp["type"] == "success": lines = rsp["msg"].split("\n") else: error_log("LoggerClient", "read_stream failure for app {}: {}".format(app, rsp)) bc.close() return lines