示例#1
0
    def emit(self, record):
        # type: (ExceptionReporter) -> None
        try:
            request = record.request  # type: HttpRequest

            exception_filter = get_exception_reporter_filter(request)

            if record.exc_info:
                stack_trace = ''.join(traceback.format_exception(*record.exc_info))
            else:
                stack_trace = None

            try:
                user_profile = request.user
                user_full_name = user_profile.full_name
                user_email = user_profile.email
            except Exception:
                traceback.print_exc()
                # Error was triggered by an anonymous user.
                user_full_name = None
                user_email = None

            data = request.GET if request.method == 'GET' else \
                exception_filter.get_post_parameters(request)

            report = dict(
                node = platform.node(),
                method = request.method,
                path = request.path,
                data = data,
                remote_addr = request.META.get('REMOTE_ADDR', None),
                query_string = request.META.get('QUERY_STRING', None),
                server_name = request.META.get('SERVER_NAME', None),
                message = record.getMessage(),
                stack_trace = stack_trace,
                user_full_name = user_full_name,
                user_email = user_email,
            )
        except Exception:
            traceback.print_exc()
            report = dict(
                node = platform.node(),
                message = record.getMessage(),
            )

        try:
            if settings.STAGING_ERROR_NOTIFICATIONS:
                # On staging, process the report directly so it can happen inside this
                # try/except to prevent looping
                from zilencer.error_notify import notify_server_error
                notify_server_error(report)
            else:
                queue_json_publish('error_reports', dict(
                    type = "server",
                    report = report,
                ), lambda x: None)
        except Exception:
            # If this breaks, complain loudly but don't pass the traceback up the stream
            # However, we *don't* want to use logging.exception since that could trigger a loop.
            logging.warning("Reporting an exception triggered an exception!", exc_info=True)
示例#2
0
文件: handlers.py 项目: zag/zulip
    def emit(self, record):
        try:
            request = record.request

            filter = get_exception_reporter_filter(request)

            if record.exc_info:
                stack_trace = ''.join(
                    traceback.format_exception(*record.exc_info))
            else:
                stack_trace = None

            try:
                user_profile = request.user
                user_full_name = user_profile.full_name
                user_email = user_profile.email
            except Exception:
                traceback.print_exc()
                # Error was triggered by an anonymous user.
                user_full_name = None
                user_email = None

            report = dict(
                node=platform.node(),
                method=request.method,
                path=request.path,
                data=request.GET if request.method == 'GET' else
                filter.get_post_parameters(request),
                remote_addr=request.META.get('REMOTE_ADDR', None),
                query_string=request.META.get('QUERY_STRING', None),
                server_name=request.META.get('SERVER_NAME', None),
                message=record.getMessage(),
                stack_trace=stack_trace,
                user_full_name=user_full_name,
                user_email=user_email,
            )
        except:
            traceback.print_exc()
            report = dict(
                node=platform.node(),
                message=record.getMessage(),
            )

        try:
            if settings.ZULIP_COM_STAGING:
                # On staging, process the report directly so it can happen inside this
                # try/except to prevent looping
                from zilencer.error_notify import notify_server_error
                notify_server_error(report)
            else:
                queue_json_publish('error_reports',
                                   dict(
                                       type="server",
                                       report=report,
                                   ), lambda x: None)
        except:
            # If this breaks, complain loudly but don't pass the traceback up the stream
            # However, we *don't* want to use logging.exception since that could trigger a loop.
            logging.warning("Reporting an exception triggered an exception!",
                            exc_info=True)
示例#3
0
    def emit(self, record):
        # type: (ExceptionReporter) -> None
        try:
            request = record.request  # type: HttpRequest

            exception_filter = get_exception_reporter_filter(request)

            if record.exc_info:
                stack_trace = ''.join(traceback.format_exception(*record.exc_info))  # type: Optional[str]
            else:
                stack_trace = None

            try:
                from django.contrib.auth.models import AnonymousUser
                user_profile = request.user
                if isinstance(user_profile, AnonymousUser):
                    user_full_name = None
                    user_email = None
                else:
                    user_full_name = user_profile.full_name
                    user_email = user_profile.email
            except Exception:
                # Unexpected exceptions here should be handled gracefully
                traceback.print_exc()
                user_full_name = None
                user_email = None

            try:
                data = request.GET if request.method == 'GET' else \
                    exception_filter.get_post_parameters(request)
            except Exception:
                # exception_filter.get_post_parameters will throw
                # RequestDataTooBig if there's a really big file uploaded
                data = {}

            try:
                host = request.get_host().split(':')[0]
            except Exception:
                # request.get_host() will throw a DisallowedHost
                # exception if the host is invalid
                host = platform.node()

            report = dict(
                node = platform.node(),
                host = host,
                method = request.method,
                path = request.path,
                data = data,
                remote_addr = request.META.get('REMOTE_ADDR', None),
                query_string = request.META.get('QUERY_STRING', None),
                server_name = request.META.get('SERVER_NAME', None),
                message = record.getMessage(),
                stack_trace = stack_trace,
                user_full_name = user_full_name,
                user_email = user_email,
            )
        except Exception:
            traceback.print_exc()
            report = dict(
                node = platform.node(),
                host = platform.node(),
                message = record.getMessage(),
            )

        try:
            if settings.STAGING_ERROR_NOTIFICATIONS:
                # On staging, process the report directly so it can happen inside this
                # try/except to prevent looping
                from zilencer.error_notify import notify_server_error
                notify_server_error(report)
            else:
                queue_json_publish('error_reports', dict(
                    type = "server",
                    report = report,
                ), lambda x: None)
        except Exception:
            # If this breaks, complain loudly but don't pass the traceback up the stream
            # However, we *don't* want to use logging.exception since that could trigger a loop.
            logging.warning("Reporting an exception triggered an exception!", exc_info=True)
示例#4
0
    def emit(self, record):
        # type: (ExceptionReporter) -> None
        try:
            request = record.request  # type: HttpRequest

            exception_filter = get_exception_reporter_filter(request)

            if record.exc_info:
                stack_trace = ''.join(
                    traceback.format_exception(
                        *record.exc_info))  # type: Optional[str]
            else:
                stack_trace = None

            try:
                from django.contrib.auth.models import AnonymousUser
                user_profile = request.user
                if isinstance(user_profile, AnonymousUser):
                    user_full_name = None
                    user_email = None
                else:
                    user_full_name = user_profile.full_name
                    user_email = user_profile.email
            except Exception:
                # Unexpected exceptions here should be handled gracefully
                traceback.print_exc()
                user_full_name = None
                user_email = None

            try:
                data = request.GET if request.method == 'GET' else \
                    exception_filter.get_post_parameters(request)
            except Exception:
                # exception_filter.get_post_parameters will throw
                # RequestDataTooBig if there's a really big file uploaded
                data = {}

            try:
                host = request.get_host().split(':')[0]
            except Exception:
                # request.get_host() will throw a DisallowedHost
                # exception if the host is invalid
                host = platform.node()

            report = dict(
                node=platform.node(),
                host=host,
                method=request.method,
                path=request.path,
                data=data,
                remote_addr=request.META.get('REMOTE_ADDR', None),
                query_string=request.META.get('QUERY_STRING', None),
                server_name=request.META.get('SERVER_NAME', None),
                message=record.getMessage(),
                stack_trace=stack_trace,
                user_full_name=user_full_name,
                user_email=user_email,
            )
        except Exception:
            traceback.print_exc()
            report = dict(
                node=platform.node(),
                host=platform.node(),
                message=record.getMessage(),
            )

        try:
            if settings.STAGING_ERROR_NOTIFICATIONS:
                # On staging, process the report directly so it can happen inside this
                # try/except to prevent looping
                from zilencer.error_notify import notify_server_error
                notify_server_error(report)
            else:
                queue_json_publish('error_reports',
                                   dict(
                                       type="server",
                                       report=report,
                                   ), lambda x: None)
        except Exception:
            # If this breaks, complain loudly but don't pass the traceback up the stream
            # However, we *don't* want to use logging.exception since that could trigger a loop.
            logging.warning("Reporting an exception triggered an exception!",
                            exc_info=True)