diff --git a/InvenTree/InvenTree/exceptions.py b/InvenTree/InvenTree/exceptions.py index 75cbaff125..8d07f53bbb 100644 --- a/InvenTree/InvenTree/exceptions.py +++ b/InvenTree/InvenTree/exceptions.py @@ -9,7 +9,6 @@ import traceback from django.conf import settings from django.core.exceptions import ValidationError as DjangoValidationError -from django.db.utils import IntegrityError, OperationalError from django.utils.translation import gettext_lazy as _ import rest_framework.views as drfviews @@ -23,13 +22,18 @@ import InvenTree.sentry logger = logging.getLogger('inventree') -def log_error(path): +def log_error(path, error_name=None, error_info=None, error_data=None): """Log an error to the database. - Uses python exception handling to extract error details Arguments: path: The 'path' (most likely a URL) associated with this error (optional) + + kwargs: + error_name: The name of the error (optional, overrides 'kind') + error_info: The error information (optional, overrides 'info') + error_data: The error data (optional, overrides 'data') """ kind, info, data = sys.exc_info() @@ -37,19 +41,31 @@ def log_error(path): if kind in settings.IGNORED_ERRORS: return + if error_name: + kind = error_name + else: + kind = getattr(kind, '__name__', 'Unknown Error') + + if error_info: + info = error_info + + if error_data: + data = error_data + else: + data = '\n'.join(traceback.format_exception(kind, info, data)) + # Log error to stderr logger.error(info) + # Ensure the error information does not exceed field size limits + path = path[:200] + kind = kind[:128] + try: - Error.objects.create( - kind=kind.__name__, - info=info, - data='\n'.join(traceback.format_exception(kind, info, data)), - path=path, - ) - except (OperationalError, IntegrityError): + Error.objects.create(kind=kind, info=info or '', data=data or '', path=path) + except Exception: # Not much we can do if logging the error throws a db exception - pass + logger.exception('Failed to log exception to database') def exception_handler(exc, context): diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index 3532218d02..b428f54679 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -361,9 +361,16 @@ class CustomSocialAccountAdapter(CustomUrlMixin, RegistratonMixin, DefaultSocial def authentication_error(self, request, provider_id, error=None, exception=None, extra_context=None): """Callback method for authentication errors.""" + if not error: + error = request.GET.get('error', None) + + if not exception: + exception = request.GET.get('error_description', None) + + path = request.path or 'sso' # Log the error to the database - log_error(request.path if request else 'sso') + log_error(path, error_name=error, error_data=exception) logger.error("SSO error for provider '%s' - check admin error log", provider_id)