import datetime as dt import time class Logger(object): ''' This logger reports status messages to an M1 channel. It can be turned on and off. Attributes: channel_name: the M1 channel name for reporting logs message_sender: function that sends the log message, with the following arguments: (channel, message, qos) enabled: whether or not ot send log messages ''' def __init__(self, channel_name, message_sender, enabled=False): self.channel_name = channel_name self.enabled = enabled self.message_sender = message_sender self.last_send = dt.datetime.utcnow() self.buffer = "" print("Logger initialized, reporting to channel " + self.channel_name) def log_message(self, message): now = dt.datetime.utcnow() # meshify database can only save one message per second per channel, so we buffer text if self.enabled: self.buffer += str(message) if (now - self.last_send).total_seconds() > 1: print("Sending log to %s: %s" % (self.channel_name, message))#this should probably print buffer not message try: self.buffer = self.jsonify(self.buffer) self.message_sender(self.channel_name, self.buffer, 0) self.last_send = now self.buffer = "" except Exception as e: print("Logger error: " + e) else: print("Buffered messages on %s" % self.channel_name) self.buffer += " ... " def enable(self): self.enabled = True print("Logger %s enabled" % self.channel_name) self.log_message("Logging enabled") def disable(self): if self.buffer: time.sleep(1) self.log_message("Logging disabled") print("Logger %s disabled" % self.channel_name) self.enabled = False def is_enabled(self): return self.enabled def jsonify(self, data): data = data.replace("\\","\\\\")#lol data = data.replace("\n", "\\\n") data = data.replace("\r", "\\\r") data = data.replace("\b", "\\\b") data = data.replace("\f", "\\\f") data = data.replace("\t", "\\\t") data = data.replace("\"", "\\\"") return data