【问题标题】:Python raven. Send part of frames蟒蛇。发送部分帧
【发布时间】:2014-03-19 12:09:37
【问题描述】:

在我们的项目中,raven 需要花费很多时间来创建并向 Sentry 发送消息。我们检查了创建有关帧的数据的许多时间成本,但我们并不经常需要有关所有帧的数据。是否有可能以及如何在出现异常或错误的帧之前创建关于并非所有帧的数据,然后将其发送到哨兵。或者可能在消息级别上创建依赖全栈/部分栈?即在关键或异常或错误级别发送完整堆栈,在调试或警告级别仅发送部分帧。

【问题讨论】:

    标签: python logging sentry raven


    【解决方案1】:

    为 Django 使用这个处理程序:

    from raven.contrib.django.handlers import SentryHandler as BaseSentryHandler
    from raven.utils.stacks import iter_stack_frames
    
    
    class SentryHandler(BaseSentryHandler):
    
        def emit(self, record):
            if not getattr(record, 'stack', None):
                record.stack = self._get_stack(record)
    
            return super(SentryHandler, self).emit(record)
    
        def _get_targetted_stack(self, stack):
            return stack
    
        def _get_stack(self, record):
            """Remove non-interesting parts of the stack.
            """
            stack = iter_stack_frames()
    
            frames = []
    
            for item in stack:
                if isinstance(item, (list, tuple)):
                    frame, lineno = item
                else:
                    frame, lineno = item, item.f_lineno
    
                frames.append((frame, lineno))
    
            # remove parts after the `logging` module was entered
            for frame_no in reversed(xrange(len(frames))):
                frame, line_no = frames[frame_no]
                module_name = getattr(frame, 'f_globals', {}).get('__name__', '')
                if module_name.startswith('logging'):
                    del frames[:frame_no + 1]
                    break
            else:
                # the entry point to `logging` module was not found
                return frames
    
            return frames
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2017-08-05
      • 2010-10-21
      • 2016-05-28
      • 2014-08-01
      • 2021-06-28
      相关资源
      最近更新 更多