gpt4 book ai didi

django - 如何有条件地记录 graphene-django 中的异常?

转载 作者:行者123 更新时间:2023-12-03 09:42:25 28 4
gpt4 key购买 nike

每当引发异常时,它们都会记录在控制台中(如果使用了 Sentry,则记录在 Sentry 中)。

许多这些异常(exception)仅旨在向用户显示。例如, django-graphql-jwt raises the PermissionDenied exception login_required decorator .

问题是这会在测试/开发期间污染控制台输出,并在生产期间将有效错误记录到 Sentry。对于上述示例等异常(exception)情况,它仅打算向用户显示,而不是记录。

作为一种解决方法,我尝试编写中间件来捕获抛出的任何异常:

class ExceptionFilterMiddleware:
IGNORED_EXCEPTIONS = (
# Local exceptions
ValidationException,
# Third-party exceptions
JSONWebTokenExpired,
PermissionDenied,
)

def on_error(self, error):
if not isinstance(error, self.IGNORED_EXCEPTIONS):
return error

def resolve(self, next, *args, **kwargs):
return next(*args, **kwargs).catch(self.on_error)

但是如果异常被捕获或没有返回,它不再填充 errors查询/变异输出中的字段。因此,所有错误都被记录下来,没有办法有条件地记录异常。

这意味着唯一的解决方案是创建一个日志过滤器,如下所示:

def skip_valid_exceptions(record):
"""
Skip exceptions for errors only intended to be displayed to the API user.
"""
skip: bool = False

if record.exc_info:
exc_type, exc_value = record.exc_info[:2]
skip = isinstance(exc_value, valid_exceptions)

return not skip

但这也不起作用,因为 record.exc_infoNone每当 Graphite 烯抛出错误时,因此不可能根据其类型有条件地过滤掉异常。

有解决方案吗?这似乎是一个常见问题,但我找不到任何解决方案。

或者,我可以不使用异常向 API 用户显示错误,但这意味着将错误放入查询结果的 data.errors 中。字段而不是 errors .这是一个标准,需要适配前端逻辑(比如Apollo的错误处理),不太理想。这也意味着不能从抛出异常的第三方库(如 django-graphql-jwt)使用任何功能。

最佳答案

尝试这个。首先确保预期的异常(exception)是 GraphQLError或它的后代。
然后像这样创建一个日志过滤器:

import logging
from graphql import GraphQLError

class GraphQLLogFilter(logging.Filter):
"""
Filter GraphQL errors that are intentional.

Any exceptions of type GraphQLError that are raised on purpose
to generate errors for GraphQL responses will be silenced from logs.
Other exceptions will be displayed so they can be tracked down.
"""
def filter(self, record):
if record.exc_info:
etype, _, _ = record.exc_info
if etype == GraphQLError:
return None
if record.stack_info and 'GraphQLError' in record.stack_info:
return None
if record.msg and 'GraphQLError' in record.msg:
return None

return True
在您的设置中使用:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
# Prevent graphql exception from displaying in console
'filters': {
'graphql_log_filter': {
'()': GraphQLLogFilter,
}
},
'loggers': {
'graphql.execution.utils': {
'level': 'WARNING',
'handlers': ['console'],
'filters': ['graphql_log_filter'],
},
},
}
相关资源:
  • Discussion on Graphene library
  • Django logging documentation
  • How filters work
  • 关于django - 如何有条件地记录 graphene-django 中的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58165464/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com