def log(self, childFD, data): """ FIXME: line buffering """ assert childFD in self._log_fds if type(data) != six.text_type: data = data.decode("utf8") if self._log_rich is None: # If it supports rich logging, it will print just the logger aware # "magic phrase" as its first message. if data[0 : len(cb_logging_aware)] == cb_logging_aware: self._log_rich = True self._log_data = u"" # Log buffer return else: self._log_rich = False system = "{:<10} {:>6}".format(self.LOGNAME, self.pid) if self._log_rich: # This guest supports rich logs. self._log_data += data while record_separator in self._log_data: log, self._log_data = self._log_data.split(record_separator, 1) try: event = json.loads(log) except ValueError: # If invalid JSON is written out, just output the raw text. # We tried! event = {"level": u"warn", "text": u"INVALID JSON: {}".format(escape_formatting(log))} event_text = event.pop("text") event_namespace = event.pop("namespace", None) level = LogLevel.levelWithName(event.pop("level")) self._logger.emit(level, event_text, log_system=system, cb_namespace=event_namespace, **event) self._log_entries.append(event) if self._log_topic: self._controller.publish(self._log_topic, event_text) else: # Rich logs aren't supported data = escape_formatting(data) for row in data.split(os.linesep): row = row.strip() if row == u"": continue self._logger.emit(LogLevel.info, row, log_system=system) self._log_entries.append(row) if self._log_topic: self._controller.publish(self._log_topic, row)
def _dump_remaining_log(self, result): """ If there's anything left in the log buffer, log it out so it's not lost. """ if self._log_rich and self._log_data != u"": self._logger.warn("REMAINING LOG BUFFER AFTER EXIT FOR PID {pid}:", pid=self.pid) for log in self._log_data.split(os.linesep): self._logger.warn(escape_formatting(log)) return result
def log(self, childFD, data): """ Handle a log message (or a fragment of such) coming in. """ assert (childFD in self._log_fds) system = "{:<10} {:>6}".format(self.LOGNAME, self.pid) if self._log_rich and childFD == 1: # For "rich logger" workers: # This is a log message made from some super dumb software that # writes directly to FD1 instead of sys.stdout (which is captured # by the logger). Because of this, we can't trust any portion of it # and repr() it. self._logger.info(repr(data), cb_namespace="FD1", log_system=system) self._log_entries.append(repr(data)) return if type(data) != six.text_type: data = data.decode('utf8') if self._log_rich is None: # If it supports rich logging, it will print just the logger aware # "magic phrase" as its first message. if data[0:len(cb_logging_aware)] == cb_logging_aware: self._log_rich = True self._log_data = u"" # Log buffer return else: self._log_rich = False if self._log_rich: # This guest supports rich logs. self._log_data += data while record_separator in self._log_data: log, self._log_data = self._log_data.split(record_separator, 1) try: event = json.loads(log) except ValueError: # If invalid JSON is written out, just output the raw text. # We tried! event = { "level": u"warn", "text": u"INVALID JSON: {}".format(escape_formatting(log)) } event_text = event.pop("text") event_namespace = event.pop("namespace", None) level = event.pop("level") self._logger.emit(level, event_text, log_system=system, cb_namespace=event_namespace, **event) self._log_entries.append(event) if self._log_topic: self._controller.publish(self._log_topic, event_text) else: # Rich logs aren't supported data = escape_formatting(data) for row in data.split(os.linesep): row = row.strip() if row == u"": continue self._logger.info(row, log_system=system) self._log_entries.append(row) if self._log_topic: self._controller.publish(self._log_topic, row)
def log(self, childFD, data): """ Handle a log message (or a fragment of such) coming in. """ assert(childFD in self._log_fds) system = "{:<10} {:>6}".format(self.LOGNAME, self.pid) if self._log_rich and childFD == 1: # For "rich logger" workers: # This is a log message made from some super dumb software that # writes directly to FD1 instead of sys.stdout (which is captured # by the logger). Because of this, we can't trust any portion of it # and repr() it. self._logger.info(repr(data), cb_namespace="FD1", log_system=system) self._log_entries.append(repr(data)) return if type(data) != six.text_type: data = data.decode('utf8') if self._log_rich is None: # If it supports rich logging, it will print just the logger aware # "magic phrase" as its first message. if data[0:len(cb_logging_aware)] == cb_logging_aware: self._log_rich = True self._log_data = u"" # Log buffer return else: self._log_rich = False if self._log_rich: # This guest supports rich logs. self._log_data += data while record_separator in self._log_data: log, self._log_data = self._log_data.split(record_separator, 1) try: event = json.loads(log) except ValueError: # If invalid JSON is written out, just output the raw text. # We tried! event = {"level": u"warn", "text": u"INVALID JSON: {}".format(escape_formatting(log))} event_text = event.pop("text") event_namespace = event.pop("namespace", None) level = event.pop("level") self._logger.emit(level, event_text, log_system=system, cb_namespace=event_namespace, **event) self._log_entries.append(event) if self._log_topic: self._controller.publish(self._log_topic, event_text) else: # Rich logs aren't supported data = escape_formatting(data) for row in data.split(os.linesep): row = row.strip() if row == u"": continue self._logger.info(row, log_system=system) self._log_entries.append(row) if self._log_topic: self._controller.publish(self._log_topic, row)
def log(self, childFD, data): """ FIXME: line buffering """ assert (childFD in self._log_fds) if type(data) != six.text_type: data = data.decode('utf8') if self._log_rich is None: # If it supports rich logging, it will print just the logger aware # "magic phrase" as its first message. if data[0:len(cb_logging_aware)] == cb_logging_aware: self._log_rich = True self._log_data = u"" # Log buffer return else: self._log_rich = False system = "{:<10} {:>6}".format(self.LOGNAME, self.pid) if self._log_rich: # This guest supports rich logs. self._log_data += data while record_separator in self._log_data: log, self._log_data = self._log_data.split(record_separator, 1) try: event = json.loads(log) except ValueError: # If invalid JSON is written out, just output the raw text. # We tried! event = { "level": u"warn", "text": u"INVALID JSON: {}".format(escape_formatting(log)) } event_text = event.pop("text") event_namespace = event.pop("namespace", None) level = LogLevel.levelWithName(event.pop("level")) self._logger.emit(level, event_text, log_system=system, cb_namespace=event_namespace, **event) self._log_entries.append(event) if self._log_topic: self._controller.publish(self._log_topic, event_text) else: # Rich logs aren't supported data = escape_formatting(data) for row in data.split(os.linesep): row = row.strip() if row == u"": continue self._logger.emit(LogLevel.info, row, log_system=system) self._log_entries.append(row) if self._log_topic: self._controller.publish(self._log_topic, row)