def _msg(self, *args, **kwargs): facility = kwargs.get('facility') if "level" not in kwargs: kwargs['level'] = OPERATIONAL level = kwargs["level"] threshold = self.get_generation_threshold(facility) if level < threshold: return # not worth logging event = kwargs # kwargs always has 'num' if "format" in event: pass elif "message" in event: event['message'] = str(event['message']) elif args: event['message'], posargs = str(args[0]), args[1:] if posargs: event['args'] = posargs else: event['message'] = "" if "time" not in event: event['time'] = time.time() if "failure" in event: f = event["failure"] # we need to avoid pickling the exception class, since that will # require the original application code to unpickle, and log # viewers may not have it installed. A CopiedFailure works great # for this purpose. TODO: I'd prefer to not use a local import # here, but doing at the top level causes a circular import # failure. from foolscap.call import FailureSlicer, CopiedFailure class FakeBroker: unsafeTracebacks = True if not isinstance(f, CopiedFailure): fs = FailureSlicer(f) f2 = CopiedFailure() f2.setCopyableState(fs.getStateToCopy(f, FakeBroker)) event["failure"] = f2 if event.get('stacktrace', False) is True: event['stacktrace'] = traceback.format_stack() event['incarnation'] = self.incarnation self.add_event(facility, level, event)
def msg(self, *args, **kwargs): """ @param parent: the event number of the most direct parent of this event @param facility: the slash-joined facility name, or None @param level: the numeric severity level, like NOISY or SCARY @param stacktrace: a string stacktrace, or True to generate one @returns: the event number for this logevent, intended to be passed to parent= in a subsequent call to msg() """ if "num" not in kwargs: num = self.seqnum.next() else: num = kwargs['num'] facility = kwargs.get('facility') if "level" not in kwargs: kwargs['level'] = OPERATIONAL level = kwargs["level"] threshold = self.get_generation_threshold(facility) if level < threshold: return num # not worth logging event = kwargs if "format" in event: pass elif "message" in event: event['message'] = str(event['message']) elif args: event['message'], posargs = str(args[0]), args[1:] if posargs: event['args'] = posargs else: event['message'] = "" if "time" not in event: event['time'] = time.time() if "failure" in event: f = event["failure"] # we need to avoid pickling the exception class, since that will # require the original application code to unpickle, and log # viewers may not have it installed. A CopiedFailure works great # for this purpose. TODO: I'd prefer to not use a local import # here, but doing at the top level causes a circular import # failure. from foolscap.call import FailureSlicer, CopiedFailure class FakeBroker: unsafeTracebacks = True if not isinstance(f, CopiedFailure): fs = FailureSlicer(f) f2 = CopiedFailure() f2.setCopyableState(fs.getStateToCopy(f, FakeBroker)) event["failure"] = f2 # verify that we can stringify the event correctly try: format_message(event) except Exception, e: print "problem in log message %s: %r %s" % (event, e, e) pass