graphene-django: Raising exceptions without logging them
Whenever exceptions are raised they’re logged in the console (and in Sentry if it’s used).
Many of these exceptions are only intended to be shown to the user. For example, django-graphql-jwt raises the PermissionDenied exception for the login_required decorator.
The problem is this pollutes the console output during testing/development and logs unnecessary errors to Sentry. For exceptions such as the example above, that’s only intended to be shown to the user.
As a workaround I’ve tried writing middleware that catches any exceptions thrown:
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)
But if an exception is caught, it no longer populates the errors field in query/mutation output. Therefore all errors are logged, there’s no way to conditionally log exceptions.
This means the only solution is to create a logging filter like the following:
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
But this doesn’t work either because record.exc_info is None whenever an error is thrown with Graphene, therefore it’s not possible to conditionally filter out exceptions based on their type.
Is there a solution for this? Seems like it’d be a common issue but I’ve had trouble finding one. Something like this would be nice to be able to implement. Thanks in advance.
About this issue
- Original URL
- State: open
- Created 5 years ago
- Reactions: 23
- Comments: 15
Responding to remove the bot’s label. I still have this issue and it’s important.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
The problem is that
report_errormethod fromExecutionContextclass ingraphql.execution.utilsis doinglogger.error("".join(exception))I have managed to fix this by monkey patch this class method.I’m currently using the following logging filter to filter out
GraphQLLocatedErrors, which get raised by the@login_requireddecorator of graphql_jwt when users are not authenticated:Nevertheless this exceptions should not end up in logging at all. I hope for a solution.
No idea what’s going on here. I think this issue should be prioritised, it’s been over 2 years.
@dspacejs I don’t think the update has anything to address this issue, but if the issue still exist after the update, fixes on the core package will be more likely to get merged.