from __future__ import print_function import sys class CloudCanvasLogger(object): instance = None class LogInitializer: def __init__(self): pass def __call__(self, *args, **kwargs): CloudCanvasLogger.instance = None if "output" not in kwargs: raise Exception("Cannot initialize CloudCanvasLogger, missing \"output\" arg") if "aws_request_id" not in kwargs: raise Exception("Cannot initialize CloudCanvasLogger, missing \"aws_request_id\" arg") output = kwargs["output"] logger = CloudCanvasLogger.instance = CloudCanvasLogger( kwargs["aws_request_id"], output) sys.stdout = logger class LogOverrider: def __init__(self): pass def __call__(self, *args, **kwargs): if "aws_request_id" not in kwargs: raise Exception( "Cannot initialize CloudCanvasLogger, missing \"aws_request_id\" arg") CloudCanvasLogger.instance.override_call_id(kwargs["aws_request_id"]) init_instance = LogInitializer() override_id = LogOverrider() def __init__(self, call_id, output): self.call_id = call_id self.output = output def Log(self, message): if not message.isspace(): self.output.write("Call ({}): {}\n".format(self.call_id, message)) def flush(self): # See if output object has flush command if self.output: flush_op = getattr(self.output, "flush", None) if callable(flush_op): flush_op() def write(self, message): self.Log(message) def override_call_id(self, call_id): self.call_id = call_id