def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info If exc_info is not provided, or is set to True, then this method will perform the ``exc_info = sys.exc_info()`` and the requisite clean-up for you. """ new_exc = False if not exc_info or exc_info is True: new_exc = True exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap( shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join( traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process(class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs) finally: # It's important that we cleanup the frames object (specifically exc_info[2]) # to ensure that GC can happen properly. if new_exc: try: del exc_info del exc_traceback except Exception, e: logger.exception(e)
def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info If exc_info is not provided, or is set to True, then this method will perform the ``exc_info = sys.exc_info()`` and the requisite clean-up for you. """ new_exc = False if not exc_info or exc_info is True: new_exc = True exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process( class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs ) finally: # It's important that we cleanup the frames object (specifically exc_info[2]) # to ensure that GC can happen properly. if new_exc: try: del exc_info del exc_traceback except Exception, e: logger.exception(e)
def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info """ new_exc = bool(exc_info) if not exc_info or exc_info is True: exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process( class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs ) finally: if new_exc: try: del exc_info except Exception, e: logger.exception(e)
def create_from_record(self, record, **kwargs): """ Creates an event for a ``logging`` module ``record`` instance. If the record contains an attribute, ``stack``, that evaluates to True, it will pass this information on to process in order to grab the stack frames. >>> class ExampleHandler(logging.Handler): >>> def emit(self, record): >>> self.format(record) >>> client.create_from_record(record) """ for k in ('url', 'view', 'data'): if not kwargs.get(k): kwargs[k] = record.__dict__.get(k) kwargs.update({ 'logger': record.name, 'level': record.levelno, 'message': force_unicode(record.msg), 'server_name': self.name, 'stack': getattr(record, 'stack', self.auto_log_stacks), }) # construct the checksum with the unparsed message kwargs['checksum'] = construct_checksum(**kwargs) # save the message with included formatting kwargs['message'] = record.getMessage() # If there's no exception being processed, exc_info may be a 3-tuple of None # http://docs.python.org/library/sys.html#sys.exc_info if record.exc_info and all(record.exc_info): return self.create_from_exception(record.exc_info, **kwargs) return self.process( traceback=record.exc_text, **kwargs )
def create_from_record(self, record, **kwargs): """ Creates an event for a ``logging`` module ``record`` instance. If the record contains an attribute, ``stack``, that evaluates to True, it will pass this information on to process in order to grab the stack frames. >>> class ExampleHandler(logging.Handler): >>> def emit(self, record): >>> self.format(record) >>> client.create_from_record(record) """ for k in ('url', 'view', 'data'): if not kwargs.get(k): kwargs[k] = record.__dict__.get(k) kwargs.update({ 'logger': record.name, 'level': record.levelno, 'message': force_unicode(record.msg), 'server_name': self.name, 'stack': getattr(record, 'stack', self.auto_log_stacks), }) # construct the checksum with the unparsed message kwargs['checksum'] = construct_checksum(**kwargs) # save the message with included formatting kwargs['message'] = record.getMessage() # If there's no exception being processed, exc_info may be a 3-tuple of None # http://docs.python.org/library/sys.html#sys.exc_info if record.exc_info and all(record.exc_info): return self.create_from_exception(record.exc_info, **kwargs) return self.process(traceback=record.exc_text, **kwargs)